Merge
This commit is contained in:
commit
f97849aa84
1
.hgtags
1
.hgtags
@ -381,3 +381,4 @@ e384420383a5b79fa0012ebcb25d8f83cff7f777 jdk-9+135
|
||||
1b4b5d01aa11edf24b6fadbe3d2f3e411e3b02cd jdk-9+136
|
||||
9cb87c88ed851c0575b8ead753ea238ed5b544e9 jdk-9+137
|
||||
d273dfe9a126d3bffe92072547fef2cd1361b0eb jdk-9+138
|
||||
65477538bec32963dc41153d89c4417eb46c45fc jdk-9+139
|
||||
|
@ -381,3 +381,4 @@ be1218f792a450dfb5d4b1f82616b9d95a6a732e jdk-9+133
|
||||
3ec350f5f32af249b59620d7e37b54bdcd77b233 jdk-9+136
|
||||
d7f519b004254b19e384131d9f0d0e40e31a0fd3 jdk-9+137
|
||||
67c4388142bdf58aec8fefa4475faaa8a5d7380c jdk-9+138
|
||||
7dcf453eacae79ee86a6bcc75fd0b546fc99b48a jdk-9+139
|
||||
|
@ -1,27 +1,27 @@
|
||||
|
||||
OPENJDK ASSEMBLY EXCEPTION
|
||||
|
||||
The OpenJDK source code made available by Sun at openjdk.java.net and
|
||||
openjdk.dev.java.net ("OpenJDK Code") is distributed under the terms of the
|
||||
GNU General Public License <http://www.gnu.org/copyleft/gpl.html> version 2
|
||||
The OpenJDK source code made available by Oracle America, Inc. (Oracle) at
|
||||
openjdk.java.net ("OpenJDK Code") is distributed under the terms of the GNU
|
||||
General Public License <http://www.gnu.org/copyleft/gpl.html> version 2
|
||||
only ("GPL2"), with the following clarification and special exception.
|
||||
|
||||
Linking this OpenJDK Code statically or dynamically with other code
|
||||
is making a combined work based on this library. Thus, the terms
|
||||
and conditions of GPL2 cover the whole combination.
|
||||
|
||||
As a special exception, Sun gives you permission to link this
|
||||
OpenJDK Code with certain code licensed by Sun as indicated at
|
||||
As a special exception, Oracle gives you permission to link this
|
||||
OpenJDK Code with certain code licensed by Oracle as indicated at
|
||||
http://openjdk.java.net/legal/exception-modules-2007-05-08.html
|
||||
("Designated Exception Modules") to produce an executable,
|
||||
regardless of the license terms of the Designated Exception Modules,
|
||||
and to copy and distribute the resulting executable under GPL2,
|
||||
provided that the Designated Exception Modules continue to be
|
||||
governed by the licenses under which they were offered by Sun.
|
||||
governed by the licenses under which they were offered by Oracle.
|
||||
|
||||
As such, it allows licensees and sublicensees of Sun's GPL2 OpenJDK Code to
|
||||
build an executable that includes those portions of necessary code that Sun
|
||||
could not provide under GPL2 (or that Sun has provided under GPL2 with the
|
||||
Classpath exception). If you modify or add to the OpenJDK code, that new
|
||||
GPL2 code may still be combined with Designated Exception Modules if the
|
||||
new code is made subject to this exception by its copyright holder.
|
||||
As such, it allows licensees and sublicensees of Oracle's GPL2 OpenJDK Code
|
||||
to build an executable that includes those portions of necessary code that
|
||||
Oracle could not provide under GPL2 (or that Oracle has provided under GPL2
|
||||
with the Classpath exception). If you modify or add to the OpenJDK code,
|
||||
that new GPL2 code may still be combined with Designated Exception Modules
|
||||
if the new code is made subject to this exception by its copyright holder.
|
||||
|
@ -654,10 +654,10 @@ compare_bin_file() {
|
||||
OTHER_DIZ_FILE="$OTHER/support/native/java.base/java_objs/java.diz"
|
||||
elif [ "$NAME" = "jimage.exe" ] \
|
||||
&& [ -f "$OTHER/support/native/jdk.jlink/jimage_objs/jimage.diz" ]; then
|
||||
OTHER_DIZ_FILE="$OTHER/support/native/jdk.jlink/jimage_objs/jimage.diz"
|
||||
OTHER_DIZ_FILE="$OTHER/support/modules_cmds/jdk.jlink/jimage.diz"
|
||||
elif [ "$NAME" = "javacpl.exe" ] \
|
||||
&& [ -f "$OTHER/support/native/jdk.plugin/javacpl/javacpl.diz" ]; then
|
||||
OTHER_DIZ_FILE="$OTHER/support/native/jdk.plugin/javacpl/javacpl.diz"
|
||||
OTHER_DIZ_FILE="$OTHER/support/modules_cmds/jdk.deploy.controlpanel/javacpl.diz"
|
||||
elif [ -f "${OTHER_FILE_BASE}.diz" ]; then
|
||||
OTHER_DIZ_FILE=${OTHER_FILE_BASE}.diz
|
||||
else
|
||||
@ -686,10 +686,10 @@ compare_bin_file() {
|
||||
THIS_DIZ_FILE="$THIS/support/native/java.base/java_objs/java.diz"
|
||||
elif [ "$NAME" = "jimage.exe" ] \
|
||||
&& [ -f "$THIS/support/native/jdk.jlink/jimage_objs/jimage.diz" ]; then
|
||||
THIS_DIZ_FILE="$THIS/support/native/jdk.jlink/jimage_objs/jimage.diz"
|
||||
THIS_DIZ_FILE="$THIS/support/modules_cmds/jdk.jlink/jimage.diz"
|
||||
elif [ "$NAME" = "javacpl.exe" ] \
|
||||
&& [ -f "$THIS/support/native/jdk.plugin/javacpl/javacpl.diz" ]; then
|
||||
THIS_DIZ_FILE="$THIS/support/native/jdk.plugin/javacpl/javacpl.diz"
|
||||
THIS_DIZ_FILE="$THIS/support/modules_cmds/jdk.deploy.controlpanel/javacpl.diz"
|
||||
elif [ -f "${THIS_FILE_BASE}.diz" ]; then
|
||||
THIS_DIZ_FILE=${THIS_FILE/.dll/}.diz
|
||||
else
|
||||
|
@ -381,3 +381,4 @@ f7e1d5337c2e550fe553df7a3886bbed80292ecd jdk-9+131
|
||||
aa053a3faf266c12b4fd5272da431a3e08e4a3e3 jdk-9+136
|
||||
258cf18fa7fc59359b874f8743b7168dc48baf73 jdk-9+137
|
||||
27bb44be32076861a0951bcefb07a1d92509a4b6 jdk-9+138
|
||||
8c9da7fc5b07c606afd571c7012441b77dda83b2 jdk-9+139
|
||||
|
@ -1,27 +1,27 @@
|
||||
|
||||
OPENJDK ASSEMBLY EXCEPTION
|
||||
|
||||
The OpenJDK source code made available by Sun at openjdk.java.net and
|
||||
openjdk.dev.java.net ("OpenJDK Code") is distributed under the terms of the
|
||||
GNU General Public License <http://www.gnu.org/copyleft/gpl.html> version 2
|
||||
The OpenJDK source code made available by Oracle America, Inc. (Oracle) at
|
||||
openjdk.java.net ("OpenJDK Code") is distributed under the terms of the GNU
|
||||
General Public License <http://www.gnu.org/copyleft/gpl.html> version 2
|
||||
only ("GPL2"), with the following clarification and special exception.
|
||||
|
||||
Linking this OpenJDK Code statically or dynamically with other code
|
||||
is making a combined work based on this library. Thus, the terms
|
||||
and conditions of GPL2 cover the whole combination.
|
||||
|
||||
As a special exception, Sun gives you permission to link this
|
||||
OpenJDK Code with certain code licensed by Sun as indicated at
|
||||
As a special exception, Oracle gives you permission to link this
|
||||
OpenJDK Code with certain code licensed by Oracle as indicated at
|
||||
http://openjdk.java.net/legal/exception-modules-2007-05-08.html
|
||||
("Designated Exception Modules") to produce an executable,
|
||||
regardless of the license terms of the Designated Exception Modules,
|
||||
and to copy and distribute the resulting executable under GPL2,
|
||||
provided that the Designated Exception Modules continue to be
|
||||
governed by the licenses under which they were offered by Sun.
|
||||
governed by the licenses under which they were offered by Oracle.
|
||||
|
||||
As such, it allows licensees and sublicensees of Sun's GPL2 OpenJDK Code to
|
||||
build an executable that includes those portions of necessary code that Sun
|
||||
could not provide under GPL2 (or that Sun has provided under GPL2 with the
|
||||
Classpath exception). If you modify or add to the OpenJDK code, that new
|
||||
GPL2 code may still be combined with Designated Exception Modules if the
|
||||
new code is made subject to this exception by its copyright holder.
|
||||
As such, it allows licensees and sublicensees of Oracle's GPL2 OpenJDK Code
|
||||
to build an executable that includes those portions of necessary code that
|
||||
Oracle could not provide under GPL2 (or that Oracle has provided under GPL2
|
||||
with the Classpath exception). If you modify or add to the OpenJDK code,
|
||||
that new GPL2 code may still be combined with Designated Exception Modules
|
||||
if the new code is made subject to this exception by its copyright holder.
|
||||
|
@ -541,3 +541,4 @@ b8b694c6b4d2ab0939aed7adaf0eec1ac321a085 jdk-9+134
|
||||
a20da289f646ee44440695b81abc0548330e4ca7 jdk-9+136
|
||||
dfcbf839e299e7e2bba1da69bdb347617ea4c7e8 jdk-9+137
|
||||
fc0956308c7a586267c5dd35dff74f773aa9c3eb jdk-9+138
|
||||
08492e67bf3226784dab3bf9ae967382ddbc1af5 jdk-9+139
|
||||
|
@ -1,9 +1,9 @@
|
||||
|
||||
OPENJDK ASSEMBLY EXCEPTION
|
||||
|
||||
The OpenJDK source code made available by Oracle at openjdk.java.net and
|
||||
openjdk.dev.java.net ("OpenJDK Code") is distributed under the terms of the
|
||||
GNU General Public License <http://www.gnu.org/copyleft/gpl.html> version 2
|
||||
The OpenJDK source code made available by Oracle America, Inc. (Oracle) at
|
||||
openjdk.java.net ("OpenJDK Code") is distributed under the terms of the GNU
|
||||
General Public License <http://www.gnu.org/copyleft/gpl.html> version 2
|
||||
only ("GPL2"), with the following clarification and special exception.
|
||||
|
||||
Linking this OpenJDK Code statically or dynamically with other code
|
||||
@ -19,9 +19,9 @@ only ("GPL2"), with the following clarification and special exception.
|
||||
provided that the Designated Exception Modules continue to be
|
||||
governed by the licenses under which they were offered by Oracle.
|
||||
|
||||
As such, it allows licensees and sublicensees of Oracle's GPL2 OpenJDK Code to
|
||||
build an executable that includes those portions of necessary code that Oracle
|
||||
could not provide under GPL2 (or that Oracle has provided under GPL2 with the
|
||||
Classpath exception). If you modify or add to the OpenJDK code, that new
|
||||
GPL2 code may still be combined with Designated Exception Modules if the
|
||||
new code is made subject to this exception by its copyright holder.
|
||||
As such, it allows licensees and sublicensees of Oracle's GPL2 OpenJDK Code
|
||||
to build an executable that includes those portions of necessary code that
|
||||
Oracle could not provide under GPL2 (or that Oracle has provided under GPL2
|
||||
with the Classpath exception). If you modify or add to the OpenJDK code,
|
||||
that new GPL2 code may still be combined with Designated Exception Modules
|
||||
if the new code is made subject to this exception by its copyright holder.
|
||||
|
@ -1,5 +1,5 @@
|
||||
#
|
||||
# Copyright (c) 2015, 2016 Oracle and/or its affiliates. All rights reserved.
|
||||
# Copyright (c) 2015, 2016, 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
|
||||
@ -45,10 +45,7 @@ $(VARIANT_TARGETS): variant-%: variant-%-gensrc variant-%-libs
|
||||
jsig:
|
||||
+$(MAKE) -f lib/CompileLibjsig.gmk
|
||||
|
||||
dist: $(VARIANT_TARGETS) jsig
|
||||
+$(MAKE) -f Dist.gmk
|
||||
|
||||
all: dist
|
||||
all: $(VARIANT_TARGETS) jsig
|
||||
|
||||
.PHONY: $(VARIANT_TARGETS) $(VARIANT_GENSRC_TARGETS) $(VARIANT_LIBS_TARGETS) \
|
||||
jsig dist all
|
||||
jsig all
|
||||
|
55
hotspot/make/CopyToExplodedJdk.gmk
Normal file
55
hotspot/make/CopyToExplodedJdk.gmk
Normal file
@ -0,0 +1,55 @@
|
||||
#
|
||||
# Copyright (c) 2016, 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.
|
||||
#
|
||||
|
||||
# Copy all built libraries into exploded jdk
|
||||
LIB_TARGETS := $(filter $(LIB_OUTPUTDIR)/%, $(TARGETS))
|
||||
ifeq ($(OPENJDK_TARGET_OS), windows)
|
||||
$(eval $(call SetupCopyFiles, COPY_LIBS_BIN, \
|
||||
SRC := $(SUPPORT_OUTPUTDIR)/modules_libs/java.base, \
|
||||
DEST := $(JDK_OUTPUTDIR)/bin, \
|
||||
FILES := $(filter-out %.lib, $(LIB_TARGETS)), \
|
||||
))
|
||||
|
||||
$(eval $(call SetupCopyFiles, COPY_LIBS_LIB, \
|
||||
SRC := $(SUPPORT_OUTPUTDIR)/modules_libs/java.base, \
|
||||
DEST := $(JDK_OUTPUTDIR)/lib, \
|
||||
FILES := $(filter %.lib, $(LIB_TARGETS))))
|
||||
|
||||
TARGETS += $(COPY_LIBS_BIN) $(COPY_LIBS_LIB)
|
||||
else
|
||||
$(eval $(call SetupCopyFiles, COPY_LIBS, \
|
||||
SRC := $(SUPPORT_OUTPUTDIR)/modules_libs/java.base, \
|
||||
DEST := $(JDK_OUTPUTDIR)/lib, \
|
||||
FILES := $(filter %$(SHARED_LIBRARY_SUFFIX), $(LIB_TARGETS)), \
|
||||
))
|
||||
$(eval $(call SetupCopyFiles, LINK_LIBS, \
|
||||
SRC := $(SUPPORT_OUTPUTDIR)/modules_libs/java.base, \
|
||||
DEST := $(JDK_OUTPUTDIR)/lib, \
|
||||
FILES := $(filter-out %$(SHARED_LIBRARY_SUFFIX), $(LIB_TARGETS)), \
|
||||
MACRO := link-file-relative, \
|
||||
))
|
||||
|
||||
TARGETS += $(COPY_LIBS) $(LINK_LIBS)
|
||||
endif
|
@ -1,223 +0,0 @@
|
||||
#
|
||||
# Copyright (c) 2013, 2016, 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.
|
||||
#
|
||||
|
||||
################################################################################
|
||||
# Copy the generated output into well-defined places in the dist directory.
|
||||
|
||||
# This must be the first rule
|
||||
default: all
|
||||
|
||||
include $(SPEC)
|
||||
include MakeBase.gmk
|
||||
|
||||
$(eval $(call IncludeCustomExtension, hotspot, Dist.gmk))
|
||||
|
||||
DIST_OUTPUTDIR := $(HOTSPOT_OUTPUTDIR)/dist
|
||||
|
||||
# Unfortunately, all platforms have different target subdirs.
|
||||
ifeq ($(OPENJDK_TARGET_OS), windows)
|
||||
LIB_SUBDIR := bin
|
||||
else ifeq ($(OPENJDK_TARGET_OS), macosx)
|
||||
LIB_SUBDIR := lib
|
||||
else
|
||||
LIB_SUBDIR := lib$(OPENJDK_TARGET_CPU_LIBDIR)
|
||||
endif
|
||||
|
||||
################################################################################
|
||||
# Setup make rules to copy a native library and associated data.
|
||||
#
|
||||
# Parameter 1 is the name of the rule. This name is used as variable prefix,
|
||||
# and the targets generated are listed in a variable by that name.
|
||||
#
|
||||
# Remaining parameters are named arguments. These include:
|
||||
# NAME -- The base name of the native library (e.g. 'jvm')
|
||||
# VARIANT -- The variant to copy from
|
||||
# VARIANT_TARGET_DIR -- The variant target sub dir, with trailing slash, optional
|
||||
SetupDistLibFile = $(NamedParamsMacroTemplate)
|
||||
define SetupDistLibFileBody
|
||||
ifneq ($$($1_VARIANT), )
|
||||
$1_SRC_DIR := $$(HOTSPOT_OUTPUTDIR)/variant-$$($1_VARIANT)/lib$$($1_NAME)
|
||||
else
|
||||
$1_SRC_DIR := $$(HOTSPOT_OUTPUTDIR)/lib$$($1_NAME)
|
||||
endif
|
||||
$1_LIB_NAME := $(LIBRARY_PREFIX)$$($1_NAME)
|
||||
$1_TARGET_DIR := $$(DIST_OUTPUTDIR)/$$(LIB_SUBDIR)/$$($1_VARIANT_TARGET_DIR)
|
||||
|
||||
# Copy the the native library.
|
||||
$$(eval $$(call SetupCopyFiles, $1_COPY_LIB, \
|
||||
DEST := $$($1_TARGET_DIR), \
|
||||
FILES := $$(wildcard \
|
||||
$$($1_SRC_DIR)/$$($1_LIB_NAME)$(SHARED_LIBRARY_SUFFIX)), \
|
||||
))
|
||||
|
||||
TARGETS += $$($1_COPY_LIB)
|
||||
|
||||
# Copy related data (debug symbols, static-build symbols file etc)
|
||||
$$(eval $$(call SetupCopyFiles, $1_COPY_FILES, \
|
||||
DEST := $$($1_TARGET_DIR), \
|
||||
FILES := $$(wildcard \
|
||||
$$(addprefix $$($1_SRC_DIR)/$$($1_LIB_NAME), \
|
||||
.diz .debuginfo .pdb .map .symbols)), \
|
||||
))
|
||||
|
||||
TARGETS += $$($1_COPY_FILES)
|
||||
|
||||
ifeq ($(OPENJDK_TARGET_OS), macosx)
|
||||
# Debug symbols on macosx is a directory, not a single file, per library.
|
||||
$1_DSYM_SRC := $$($1_SRC_DIR)/$$($1_LIB_NAME)$(SHARED_LIBRARY_SUFFIX).dSYM)
|
||||
ifneq ($$(wildcard $$($1_DSYM_SRC)), )
|
||||
$$(eval $$(call SetupCopyFiles, $1_COPY_DSYM_DIR, \
|
||||
DEST := $$($1_TARGET_DIR), \
|
||||
SRC := $$($1_SRC_DIR), \
|
||||
FILES := $$(shell $(FIND) $$($1_DSYM_SRC) -type f), \
|
||||
))
|
||||
TARGETS += $$($1_COPY_DSYM_DIR)
|
||||
endif
|
||||
endif
|
||||
endef
|
||||
|
||||
################################################################################
|
||||
# Copy common files, which are independent on the jvm variant(s) being built.
|
||||
# For files that were generated during the build, we assume all versions of
|
||||
# these files are identical, and just pick one arbitrarily to use as source.
|
||||
|
||||
ANY_JVM_VARIANT := $(firstword $(JVM_VARIANTS))
|
||||
JVM_VARIANT_OUTPUTDIR := $(HOTSPOT_OUTPUTDIR)/variant-$(ANY_JVM_VARIANT)
|
||||
|
||||
### Copy platform-independent .h files
|
||||
INCLUDE_FILES_SRC_DIR := $(HOTSPOT_TOPDIR)/src/share/vm
|
||||
$(eval $(call SetupCopyFiles, COPY_INCLUDE, \
|
||||
SRC := $(INCLUDE_FILES_SRC_DIR), \
|
||||
DEST := $(DIST_OUTPUTDIR)/include, \
|
||||
FLATTEN := true, \
|
||||
FILES := $(INCLUDE_FILES_SRC_DIR)/prims/jni.h \
|
||||
$(INCLUDE_FILES_SRC_DIR)/code/jvmticmlr.h \
|
||||
$(INCLUDE_FILES_SRC_DIR)/services/jmm.h))
|
||||
|
||||
TARGETS += $(COPY_INCLUDE)
|
||||
|
||||
### Copy jni_md.h
|
||||
|
||||
# This might have been defined in a custom extension
|
||||
ifeq ($(JNI_MD_H_SRC), )
|
||||
JNI_MD_H_SRC := $(HOTSPOT_TOPDIR)/src/cpu/$(HOTSPOT_TARGET_CPU_ARCH)/vm/jni_$(HOTSPOT_TARGET_CPU_ARCH).h
|
||||
endif
|
||||
|
||||
ifeq ($(OPENJDK_TARGET_OS), macosx)
|
||||
# NOTE: This should most likely be darwin, but the old hotspot build uses bsd
|
||||
JNI_MD_SUBDIR := bsd
|
||||
else ifeq ($(OPENJDK_TARGET_OS), windows)
|
||||
JNI_MD_SUBDIR := win32
|
||||
else
|
||||
JNI_MD_SUBDIR := $(OPENJDK_TARGET_OS)
|
||||
endif
|
||||
|
||||
# SetupCopyFiles is not used here since it's non-trivial to copy a single
|
||||
# file with a different target name.
|
||||
$(DIST_OUTPUTDIR)/include/$(JNI_MD_SUBDIR)/jni_md.h: $(JNI_MD_H_SRC)
|
||||
$(call LogInfo, Copying hotspot/dist/include/$(JNI_MD_SUBDIR)/jni_md.h)
|
||||
$(install-file)
|
||||
|
||||
TARGETS += $(DIST_OUTPUTDIR)/include/$(JNI_MD_SUBDIR)/jni_md.h
|
||||
|
||||
$(eval $(call SetupCopyFiles, COPY_JVMTI_H, \
|
||||
DEST := $(DIST_OUTPUTDIR)/include, \
|
||||
FLATTEN := true, \
|
||||
FILES := $(JVM_VARIANT_OUTPUTDIR)/gensrc/jvmtifiles/jvmti.h))
|
||||
|
||||
TARGETS += $(COPY_JVMTI_H)
|
||||
|
||||
# NOTE: In the old build, this file was not copied on Windows.
|
||||
ifneq ($(OPENJDK_TARGET_OS), windows)
|
||||
$(eval $(call SetupCopyFiles, COPY_JVMTI_HTML, \
|
||||
DEST := $(DIST_OUTPUTDIR)/docs/platform/jvmti, \
|
||||
FILES := $(JVM_VARIANT_OUTPUTDIR)/gensrc/jvmtifiles/jvmti.html))
|
||||
endif
|
||||
|
||||
TARGETS += $(COPY_JVMTI_HTML)
|
||||
|
||||
ifeq ($(OPENJDK_TARGET_OS), windows)
|
||||
$(eval $(call SetupCopyFiles, COPY_JVM_LIB, \
|
||||
DEST := $(DIST_OUTPUTDIR)/lib, \
|
||||
FILES :=$(JVM_VARIANT_OUTPUTDIR)/libjvm/objs/jvm.lib))
|
||||
|
||||
TARGETS += $(COPY_JVM_LIB)
|
||||
endif
|
||||
|
||||
# Copy libjsig, if it exists
|
||||
$(eval $(call SetupDistLibFile, DIST_jsig, \
|
||||
NAME := jsig, \
|
||||
))
|
||||
|
||||
################################################################################
|
||||
# Copy variant-specific files
|
||||
|
||||
# Setup make rules to copy a single variant to dist.
|
||||
# $1: The name of the variant
|
||||
define SetupDistForVariant
|
||||
ifneq ($$(filter client minimal, $1), )
|
||||
VARIANT_TARGET_DIR := $1
|
||||
else
|
||||
# Use 'server' as default target directory name for all other variants.
|
||||
VARIANT_TARGET_DIR := server
|
||||
endif
|
||||
|
||||
$$(eval $$(call SetupDistLibFile, DIST_$(strip $1)_jvm, \
|
||||
NAME := jvm, \
|
||||
VARIANT := $1, \
|
||||
VARIANT_TARGET_DIR := $$(VARIANT_TARGET_DIR)/, \
|
||||
))
|
||||
|
||||
# Copy the dtrace libraries, if they exist
|
||||
$$(eval $$(call SetupDistLibFile, DIST_$(strip $1)_jvm_db, \
|
||||
NAME := jvm_db, \
|
||||
VARIANT := $1, \
|
||||
VARIANT_TARGET_DIR := $$(VARIANT_TARGET_DIR)/, \
|
||||
))
|
||||
|
||||
$$(eval $$(call SetupDistLibFile, DIST_$(strip $1)_jvm_dtrace, \
|
||||
NAME := jvm_dtrace, \
|
||||
VARIANT := $1, \
|
||||
VARIANT_TARGET_DIR := $$(VARIANT_TARGET_DIR)/, \
|
||||
))
|
||||
|
||||
# Copy the Xusage.txt file
|
||||
$$(eval $$(call SetupCopyFiles, DIST_$(strip $1)_Xusage, \
|
||||
DEST := $$(DIST_OUTPUTDIR)/$$(LIB_SUBDIR)/$(strip $1), \
|
||||
FILES := $$(HOTSPOT_OUTPUTDIR)/variant-$(strip $1)/support/misc/Xusage.txt, \
|
||||
))
|
||||
|
||||
TARGETS += $$(DIST_$(strip $1)_Xusage)
|
||||
endef
|
||||
|
||||
$(foreach variant, $(JVM_VARIANTS), \
|
||||
$(eval $(call SetupDistForVariant, $(variant))) \
|
||||
)
|
||||
|
||||
################################################################################
|
||||
|
||||
all: $(TARGETS)
|
||||
|
||||
.PHONY: all
|
@ -33,6 +33,15 @@ JVM_SUPPORT_DIR := $(JVM_VARIANT_OUTPUTDIR)/support
|
||||
|
||||
DTRACE_SUPPORT_DIR := $(JVM_SUPPORT_DIR)/dtrace
|
||||
|
||||
LIB_OUTPUTDIR := $(call FindLibDirForModule, java.base)
|
||||
ifneq ($(filter client minimal, $(JVM_VARIANT)), )
|
||||
JVM_VARIANT_SUBDIR := $(JVM_VARIANT)
|
||||
else
|
||||
# Use 'server' as default target directory name for all other variants.
|
||||
JVM_VARIANT_SUBDIR := server
|
||||
endif
|
||||
JVM_LIB_OUTPUTDIR := $(LIB_OUTPUTDIR)/$(JVM_VARIANT_SUBDIR)
|
||||
|
||||
################################################################################
|
||||
|
||||
# Test if a feature is available in the present build of JVM_VARIANT. Will return
|
||||
|
67
hotspot/make/copy/Copy-java.base.gmk
Normal file
67
hotspot/make/copy/Copy-java.base.gmk
Normal file
@ -0,0 +1,67 @@
|
||||
#
|
||||
# Copyright (c) 2016, 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.
|
||||
#
|
||||
|
||||
# These include files are currently being copied from the jdk repository for
|
||||
# historical reasons. Disable copying from here until this has been cleaned up.
|
||||
# The files in hotspot differ slightly from the corresponding files in jdk.
|
||||
# See JDK-8167078.
|
||||
|
||||
INCLUDE_DST_DIR := $(SUPPORT_OUTPUTDIR)/modules_include/$(MODULE)
|
||||
|
||||
################################################################################
|
||||
# Copy platform-independent .h files
|
||||
$(eval $(call SetupCopyFiles, COPY_INCLUDE_FILES, \
|
||||
SRC := $(HOTSPOT_TOPDIR)/src/share/vm, \
|
||||
DEST := $(INCLUDE_DST_DIR), \
|
||||
FLATTEN := true, \
|
||||
FILES := prims/jni.h code/jvmticmlr.h \
|
||||
))
|
||||
|
||||
#TARGETS += $(COPY_INCLUDE_FILES)
|
||||
|
||||
################################################################################
|
||||
# Copy jni_md.h
|
||||
|
||||
# This might have been defined in a custom extension
|
||||
JNI_MD_H_SRC ?= $(HOTSPOT_TOPDIR)/src/cpu/$(HOTSPOT_TARGET_CPU_ARCH)/vm/jni_$(HOTSPOT_TARGET_CPU_ARCH).h
|
||||
|
||||
ifeq ($(OPENJDK_TARGET_OS), macosx)
|
||||
# NOTE: This should most likely be darwin, but the old hotspot build uses bsd
|
||||
JNI_MD_SUBDIR := bsd
|
||||
else ifeq ($(OPENJDK_TARGET_OS), windows)
|
||||
JNI_MD_SUBDIR := win32
|
||||
else
|
||||
JNI_MD_SUBDIR := $(OPENJDK_TARGET_OS)
|
||||
endif
|
||||
|
||||
# SetupCopyFiles is not used here since it's non-trivial to copy a single
|
||||
# file with a different target name.
|
||||
$(INCLUDE_DST_DIR)/$(JNI_MD_SUBDIR)/jni_md.h: $(JNI_MD_H_SRC)
|
||||
$(call LogInfo, Copying hotspot/dist/include/$(JNI_MD_SUBDIR)/jni_md.h)
|
||||
$(install-file)
|
||||
|
||||
#TARGETS += $(INCLUDE_DST_DIR)/$(JNI_MD_SUBDIR)/jni_md.h
|
||||
|
||||
################################################################################
|
@ -47,7 +47,7 @@ $(eval $(call IncludeCustomExtension, hotspot, gensrc/GenerateSources.gmk))
|
||||
# The Xusage.txt file needs to have platform specific path separator
|
||||
$(eval $(call SetupTextFileProcessing, CREATE_XUSAGE, \
|
||||
SOURCE_FILES := $(HOTSPOT_TOPDIR)/src/share/vm/Xusage.txt, \
|
||||
OUTPUT_FILE := $(JVM_SUPPORT_DIR)/misc/Xusage.txt, \
|
||||
OUTPUT_FILE := $(JVM_LIB_OUTPUTDIR)/Xusage.txt, \
|
||||
REPLACEMENTS := separated by ;> => separated by $(PATH_SEP)> ; , \
|
||||
))
|
||||
|
||||
|
@ -67,7 +67,8 @@ define SetupXslTransformBody
|
||||
$$($1_OUTPUT_DIR)/$1: $$($1_XML_FILE) $$($1_XSL_FILE) $$($1_DEPS) $$(BUILD_JVMTI_TOOLS)
|
||||
$$(call LogInfo, Generating $$(@F))
|
||||
$$(call MakeDir, $$(@D))
|
||||
$$(call ExecuteWithLog, $$@, $$(TOOL_JVMTI_GEN) -IN $$($1_XML_FILE) -XSL $$($1_XSL_FILE) -OUT $$@ $$($1_ARGS))
|
||||
$$(call ExecuteWithLog, $$@, $$(TOOL_JVMTI_GEN) -IN $$($1_XML_FILE) \
|
||||
-XSL $$($1_XSL_FILE) -OUT $$@ $$($1_ARGS))
|
||||
# jvmtiGen does not return error code properly on fail.
|
||||
# NOTE: We should really fix jvmtiGen.java instead.
|
||||
test -f $$@
|
||||
@ -128,14 +129,29 @@ $(JVMTI_OUTPUTDIR)/jvmtiEnvRecommended.cpp: $(JVMTI_SRCDIR)/jvmtiEnv.cpp \
|
||||
|
||||
TARGETS += $(JVMTI_OUTPUTDIR)/jvmtiEnvRecommended.cpp
|
||||
|
||||
################################################################################
|
||||
# Disable copy of jvmti.h from hotspot until this has been cleared up. The file
|
||||
# is currently being copied from the jdk repository. See JDK-8167078.
|
||||
# Copy jvmti.h to include dir
|
||||
|
||||
# The file is the same regardless of jvm variant. Only let one do the copy.
|
||||
#ifeq ($(JVM_VARIANT), $(firstword $(JVM_VARIANTS)))
|
||||
# $(eval $(call SetupCopyFiles, COPY_JVMTI_H, \
|
||||
# DEST := $(SUPPORT_OUTPUTDIR)/modules_include/java.base, \
|
||||
# FILES := $(JVMTI_OUTPUTDIR)/jvmti.h, \
|
||||
# ))
|
||||
|
||||
# TARGETS += $(COPY_JVMTI_H)
|
||||
#endif
|
||||
|
||||
################################################################################
|
||||
# Create trace files in gensrc/tracefiles
|
||||
|
||||
TRACE_OUTPUTDIR := $(JVM_VARIANT_OUTPUTDIR)/gensrc/tracefiles
|
||||
TRACE_SRCDIR := $(HOTSPOT_TOPDIR)/src/share/vm/trace
|
||||
|
||||
# Append directories to search (might have been set by custom extensions)
|
||||
TRACE_SEARCH_DIRS += $(TRACE_SRCDIR)
|
||||
# Append list of XSL files to search (might have been set by custom extensions)
|
||||
TRACE_XSL_FILES += $(wildcard $(TRACE_SRCDIR)/*.xsl)
|
||||
|
||||
TRACE_XML ?= $(TRACE_SRCDIR)/trace.xml
|
||||
|
||||
@ -155,7 +171,7 @@ TRACE_DEPS += \
|
||||
define SetupTraceGeneration
|
||||
$$(eval $$(call SetupXslTransform, $1, \
|
||||
XML_FILE := $$(TRACE_XML), \
|
||||
XSL_FILE := $$(firstword $$(wildcard $$(addsuffix /$$(basename $1).xsl, $$(TRACE_SEARCH_DIRS)))), \
|
||||
XSL_FILE := $$(firstword $$(filter %/$$(basename $1).xsl, $$(TRACE_XSL_FILES))), \
|
||||
OUTPUT_DIR := $$(TRACE_OUTPUTDIR), \
|
||||
DEPS := $$(TRACE_DEPS), \
|
||||
))
|
||||
|
@ -180,7 +180,7 @@ ifeq ($(call check-jvm-feature, dtrace), true)
|
||||
|
||||
$(eval $(call SetupNativeCompilation, BUILD_LIBJVM_DTRACE, \
|
||||
LIBRARY := jvm_dtrace, \
|
||||
OUTPUT_DIR := $(LIBJVM_DTRACE_OUTPUTDIR), \
|
||||
OUTPUT_DIR := $(JVM_LIB_OUTPUTDIR), \
|
||||
SRC := $(HOTSPOT_TOPDIR)/src/os/solaris/dtrace, \
|
||||
INCLUDE_FILES := jvm_dtrace.c, \
|
||||
CFLAGS := -m64 -G -mt -KPIC, \
|
||||
@ -197,7 +197,7 @@ ifeq ($(call check-jvm-feature, dtrace), true)
|
||||
# the old build.
|
||||
$(eval $(call SetupNativeCompilation, BUILD_LIBJVM_DB, \
|
||||
LIBRARY := jvm_db, \
|
||||
OUTPUT_DIR := $(LIBJVM_DB_OUTPUTDIR), \
|
||||
OUTPUT_DIR := $(JVM_LIB_OUTPUTDIR), \
|
||||
SRC := $(HOTSPOT_TOPDIR)/src/os/solaris/dtrace, \
|
||||
INCLUDE_FILES := libjvm_db.c, \
|
||||
CFLAGS := -I$(JVM_VARIANT_OUTPUTDIR)/gensrc -I$(DTRACE_SUPPORT_DIR) \
|
||||
|
@ -174,13 +174,6 @@ ifeq ($(OPENJDK_TARGET_OS), windows)
|
||||
JVM_RCFLAGS += -D"HS_FILEDESC=$(HOTSPOT_VM_DISTRO) $(RC_DESC)$(JVM_VARIANT) VM"
|
||||
endif
|
||||
|
||||
ifeq ($(OPENJDK_TARGET_OS), macosx)
|
||||
# NOTE: The old build did not strip binaries on macosx.
|
||||
JVM_STRIP_SYMBOLS := false
|
||||
else
|
||||
JVM_STRIP_SYMBOLS := true
|
||||
endif
|
||||
|
||||
JVM_OPTIMIZATION ?= HIGHEST_JVM
|
||||
|
||||
################################################################################
|
||||
@ -189,7 +182,7 @@ JVM_OPTIMIZATION ?= HIGHEST_JVM
|
||||
$(eval $(call SetupNativeCompilation, BUILD_LIBJVM, \
|
||||
TOOLCHAIN := TOOLCHAIN_LINK_CXX, \
|
||||
LIBRARY := jvm, \
|
||||
OUTPUT_DIR := $(JVM_OUTPUTDIR), \
|
||||
OUTPUT_DIR := $(JVM_LIB_OUTPUTDIR), \
|
||||
SRC := $(JVM_SRC_DIRS), \
|
||||
EXCLUDES := $(JVM_EXCLUDES), \
|
||||
EXCLUDE_FILES := $(JVM_EXCLUDE_FILES), \
|
||||
@ -211,7 +204,6 @@ $(eval $(call SetupNativeCompilation, BUILD_LIBJVM, \
|
||||
OBJECT_DIR := $(JVM_OUTPUTDIR)/objs, \
|
||||
MAPFILE := $(JVM_MAPFILE), \
|
||||
USE_MAPFILE_FOR_SYMBOLS := true, \
|
||||
STRIP_SYMBOLS := $(JVM_STRIP_SYMBOLS), \
|
||||
EMBED_MANIFEST := true, \
|
||||
RC_FLAGS := $(JVM_RCFLAGS), \
|
||||
VERSIONINFO_RESOURCE := $(HOTSPOT_TOPDIR)/src/os/windows/vm/version.rc, \
|
||||
@ -219,6 +211,18 @@ $(eval $(call SetupNativeCompilation, BUILD_LIBJVM, \
|
||||
PRECOMPILED_HEADER_EXCLUDE := $(JVM_PRECOMPILED_HEADER_EXCLUDE), \
|
||||
))
|
||||
|
||||
ifeq ($(OPENJDK_TARGET_OS), windows)
|
||||
# It doesn't matter which jvm.lib file gets exported, but we need
|
||||
# to pick just one.
|
||||
ifeq ($(JVM_VARIANT), $(firstword $(JVM_VARIANTS)))
|
||||
$(eval $(call SetupCopyFiles, COPY_JVM_LIB, \
|
||||
DEST := $(LIB_OUTPUTDIR), \
|
||||
FILES :=$(JVM_VARIANT_OUTPUTDIR)/libjvm/objs/jvm.lib, \
|
||||
))
|
||||
TARGETS += $(COPY_JVM_LIB)
|
||||
endif
|
||||
endif
|
||||
|
||||
# AIX warning explanation:
|
||||
# 1500-010 : (W) WARNING in ...: Infinite loop. Program may not stop.
|
||||
# There are several infinite loops in the vm, so better suppress.
|
||||
|
@ -34,7 +34,6 @@ include NativeCompilation.gmk
|
||||
|
||||
ifneq ($(OPENJDK_TARGET_OS), windows)
|
||||
ifeq ($(STATIC_BUILD), false)
|
||||
LIBJSIG_STRIP_SYMBOLS := true
|
||||
ifeq ($(OPENJDK_TARGET_OS), linux)
|
||||
LIBJSIG_CFLAGS := -fPIC -D_GNU_SOURCE -D_REENTRANT $(EXTRA_CFLAGS)
|
||||
LIBJSIG_LDFLAGS := $(LDFLAGS_HASH_STYLE) $(EXTRA_CFLAGS)
|
||||
@ -72,8 +71,6 @@ ifneq ($(OPENJDK_TARGET_OS), windows)
|
||||
else ifeq ($(OPENJDK_TARGET_OS), macosx)
|
||||
LIBJSIG_CFLAGS := -m64 -D_GNU_SOURCE -pthread -mno-omit-leaf-frame-pointer -mstack-alignment=16 -fPIC
|
||||
LIBJSIG_LDFLAGS := $(LDFLAGS_HASH_STYLE)
|
||||
# NOTE: This lib is not stripped on macosx in old build. Looks like a mistake.
|
||||
LIBJSIG_STRIP_SYMBOLS := false
|
||||
else
|
||||
$(error Unknown target OS $(OPENJDK_TARGET_OS) in CompileLibjsig.gmk)
|
||||
endif
|
||||
@ -84,20 +81,71 @@ ifneq ($(OPENJDK_TARGET_OS), windows)
|
||||
|
||||
LIBJSIG_LDFLAGS += $(SHARED_LIBRARY_FLAGS)
|
||||
|
||||
LIB_OUTPUTDIR := $(call FindLibDirForModule, java.base)
|
||||
|
||||
$(eval $(call SetupNativeCompilation, BUILD_LIBJSIG, \
|
||||
LIBRARY := jsig, \
|
||||
EXTRA_FILES := $(LIBJSIG_SRC_FILE), \
|
||||
OUTPUT_DIR := $(LIBJSIG_OUTPUTDIR), \
|
||||
OUTPUT_DIR := $(LIB_OUTPUTDIR), \
|
||||
LANG := C, \
|
||||
CFLAGS := $(LIBJSIG_CFLAGS) $(LIBJSIG_CPU_FLAGS), \
|
||||
LDFLAGS := $(LIBJSIG_LDFLAGS) $(LIBJSIG_CPU_FLAGS), \
|
||||
LIBS := $(LIBJSIG_LIBS), \
|
||||
MAPFILE := $(LIBJSIG_MAPFILE), \
|
||||
OBJECT_DIR := $(LIBJSIG_OUTPUTDIR)/objs, \
|
||||
STRIP_SYMBOLS := $(LIBJSIG_STRIP_SYMBOLS), \
|
||||
))
|
||||
|
||||
TARGETS += $(BUILD_LIBJSIG)
|
||||
|
||||
############################################################################
|
||||
# Create symlinks in each variant sub dir
|
||||
ifeq ($(OPENJDK_TARGET_OS), macosx)
|
||||
DEBUG_INFO_SUFFIX := $(SHARED_LIBRARY_SUFFIX).dSYM
|
||||
else
|
||||
DEBUG_INFO_SUFFIX := .debuginfo
|
||||
endif
|
||||
|
||||
# $1 variant subdir
|
||||
define CreateSymlinks
|
||||
# Always symlink from libdir/variant/libjsig.so -> ../libjsig.so and
|
||||
# the corresponding debuginfo.
|
||||
$(LIB_OUTPUTDIR)/$1/$(call SHARED_LIBRARY,jsig): \
|
||||
$(LIB_OUTPUTDIR)/$(call SHARED_LIBRARY,jsig)
|
||||
$$(call MakeDir, $$(@D))
|
||||
$(RM) $$@
|
||||
$(LN) -s ../$$(@F) $$@
|
||||
|
||||
TARGETS += $(LIB_OUTPUTDIR)/$1/$(call SHARED_LIBRARY,jsig)
|
||||
|
||||
ifeq ($(COPY_DEBUG_SYMBOLS), true)
|
||||
$(LIB_OUTPUTDIR)/$1/$(LIBRARY_PREFIX)jsig$(DEBUG_INFO_SUFFIX): \
|
||||
$(LIB_OUTPUTDIR)/$(call SHARED_LIBRARY,jsig)
|
||||
$$(call MakeDir, $$(@D))
|
||||
$(RM) $$@
|
||||
$(LN) -s ../$$(@F) $$@
|
||||
|
||||
TARGETS += $(LIB_OUTPUTDIR)/$1/$(LIBRARY_PREFIX)jsig$(DEBUG_INFO_SUFFIX)
|
||||
|
||||
ifeq ($(ZIP_EXTERNAL_DEBUG_SYMBOLS), true)
|
||||
$(LIB_OUTPUTDIR)/$1/$(LIBRARY_PREFIX)jsig.diz: \
|
||||
$(LIB_OUTPUTDIR)/$1/$(LIBRARY_PREFIX)jsig$(DEBUG_INFO_SUFFIX)
|
||||
$(CD) $$(@D) && $(ZIP) -q -y $$@ $$(basename $$(@F))$(DEBUG_INFO_SUFFIX)
|
||||
|
||||
TARGETS += $(LIB_OUTPUTDIR)/$1/$(LIBRARY_PREFIX)jsig.diz
|
||||
endif
|
||||
endif
|
||||
endef
|
||||
|
||||
# The subdir is the same as the variant for client and minimal, for all
|
||||
# others it's server.
|
||||
VARIANT_SUBDIRS := $(filter client minimal, $(JVM_VARIANTS)) \
|
||||
$(if $(filter-out client minimal, $(JVM_VARIANTS)), server)
|
||||
$(foreach v, $(VARIANT_SUBDIRS), $(eval $(call CreateSymlinks,$v)))
|
||||
|
||||
############################################################################
|
||||
|
||||
include CopyToExplodedJdk.gmk
|
||||
|
||||
endif
|
||||
endif
|
||||
|
||||
|
@ -41,6 +41,8 @@ ifeq ($(BUILD_GTEST), true)
|
||||
include lib/CompileGtest.gmk
|
||||
endif
|
||||
|
||||
include CopyToExplodedJdk.gmk
|
||||
|
||||
all: $(TARGETS)
|
||||
|
||||
.PHONY: all
|
||||
|
@ -31,6 +31,7 @@ $(eval $(call IncludeCustomExtension, hotspot, lib/JvmOverrideFiles.gmk))
|
||||
|
||||
ifeq ($(TOOLCHAIN_TYPE), gcc)
|
||||
BUILD_LIBJVM_vmStructs.cpp_CXXFLAGS := -fno-var-tracking-assignments -O0
|
||||
BUILD_LIBJVM_jvmciCompilerToVM.cpp_CXXFLAGS := -fno-var-tracking-assignments
|
||||
endif
|
||||
|
||||
ifeq ($(OPENJDK_TARGET_OS), linux)
|
||||
|
@ -55,6 +55,9 @@ BUILD_HOTSPOT_JTREG_NATIVE_SRC := \
|
||||
$(HOTSPOT_TOPDIR)/test/testlibrary/jvmti \
|
||||
$(HOTSPOT_TOPDIR)/test/compiler/jvmci/jdk.vm.ci.code.test \
|
||||
$(HOTSPOT_TOPDIR)/test/serviceability/jvmti/GetModulesInfo \
|
||||
$(HOTSPOT_TOPDIR)/test/serviceability/jvmti/ModuleAwareAgents/ClassFileLoadHook \
|
||||
$(HOTSPOT_TOPDIR)/test/serviceability/jvmti/ModuleAwareAgents/ClassLoadPrepare \
|
||||
$(HOTSPOT_TOPDIR)/test/serviceability/jvmti/ModuleAwareAgents/ThreadStart \
|
||||
#
|
||||
|
||||
# Add conditional directories here when needed.
|
||||
@ -75,6 +78,9 @@ ifeq ($(TOOLCHAIN_TYPE), solstudio)
|
||||
BUILD_HOTSPOT_JTREG_LIBRARIES_LIBS_liboverflow := -lc
|
||||
BUILD_HOTSPOT_JTREG_LIBRARIES_LIBS_libSimpleClassFileLoadHook := -lc
|
||||
BUILD_HOTSPOT_JTREG_LIBRARIES_LIBS_libGetNamedModuleTest := -lc
|
||||
BUILD_HOTSPOT_JTREG_LIBRARIES_LIBS_libMAAClassFileLoadHook := -lc
|
||||
BUILD_HOTSPOT_JTREG_LIBRARIES_LIBS_libMAAClassLoadPrepare := -lc
|
||||
BUILD_HOTSPOT_JTREG_LIBRARIES_LIBS_libMAAThreadStart := -lc
|
||||
endif
|
||||
|
||||
ifeq ($(OPENJDK_TARGET_OS), linux)
|
||||
|
@ -140,10 +140,11 @@ LIR_Opr LIRGenerator::safepoint_poll_register() {
|
||||
LIR_Address* LIRGenerator::generate_address(LIR_Opr base, LIR_Opr index,
|
||||
int shift, int disp, BasicType type) {
|
||||
assert(base->is_register(), "must be");
|
||||
intx large_disp = disp;
|
||||
|
||||
// accumulate fixed displacements
|
||||
if (index->is_constant()) {
|
||||
disp += index->as_constant_ptr()->as_jint() << shift;
|
||||
large_disp += (intx)(index->as_constant_ptr()->as_jint()) << shift;
|
||||
index = LIR_OprFact::illegalOpr;
|
||||
}
|
||||
|
||||
@ -154,31 +155,31 @@ LIR_Address* LIRGenerator::generate_address(LIR_Opr base, LIR_Opr index,
|
||||
__ shift_left(index, shift, tmp);
|
||||
index = tmp;
|
||||
}
|
||||
if (disp != 0) {
|
||||
if (large_disp != 0) {
|
||||
LIR_Opr tmp = new_pointer_register();
|
||||
if (Assembler::operand_valid_for_add_sub_immediate(disp)) {
|
||||
__ add(tmp, tmp, LIR_OprFact::intptrConst(disp));
|
||||
if (Assembler::operand_valid_for_add_sub_immediate(large_disp)) {
|
||||
__ add(tmp, tmp, LIR_OprFact::intptrConst(large_disp));
|
||||
index = tmp;
|
||||
} else {
|
||||
__ move(tmp, LIR_OprFact::intptrConst(disp));
|
||||
__ move(tmp, LIR_OprFact::intptrConst(large_disp));
|
||||
__ add(tmp, index, tmp);
|
||||
index = tmp;
|
||||
}
|
||||
disp = 0;
|
||||
large_disp = 0;
|
||||
}
|
||||
} else if (disp != 0 && !Address::offset_ok_for_immed(disp, shift)) {
|
||||
} else if (large_disp != 0 && !Address::offset_ok_for_immed(large_disp, shift)) {
|
||||
// index is illegal so replace it with the displacement loaded into a register
|
||||
index = new_pointer_register();
|
||||
__ move(LIR_OprFact::intptrConst(disp), index);
|
||||
disp = 0;
|
||||
__ move(LIR_OprFact::intptrConst(large_disp), index);
|
||||
large_disp = 0;
|
||||
}
|
||||
|
||||
// at this point we either have base + index or base + displacement
|
||||
if (disp == 0) {
|
||||
if (large_disp == 0) {
|
||||
return new LIR_Address(base, index, type);
|
||||
} else {
|
||||
assert(Address::offset_ok_for_immed(disp, 0), "must be");
|
||||
return new LIR_Address(base, disp, type);
|
||||
assert(Address::offset_ok_for_immed(large_disp, 0), "must be");
|
||||
return new LIR_Address(base, large_disp, type);
|
||||
}
|
||||
}
|
||||
|
||||
@ -192,7 +193,7 @@ LIR_Address* LIRGenerator::emit_array_address(LIR_Opr array_opr, LIR_Opr index_o
|
||||
LIR_Address* addr;
|
||||
if (index_opr->is_constant()) {
|
||||
addr = new LIR_Address(array_opr,
|
||||
offset_in_bytes + index_opr->as_jint() * elem_size, type);
|
||||
offset_in_bytes + (intx)(index_opr->as_jint()) * elem_size, type);
|
||||
} else {
|
||||
if (offset_in_bytes) {
|
||||
LIR_Opr tmp = new_pointer_register();
|
||||
@ -1032,6 +1033,10 @@ void LIRGenerator::do_update_CRC32C(Intrinsic* x) {
|
||||
Unimplemented();
|
||||
}
|
||||
|
||||
void LIRGenerator::do_FmaIntrinsic(Intrinsic* x) {
|
||||
fatal("FMA intrinsic is not implemented on this platform");
|
||||
}
|
||||
|
||||
void LIRGenerator::do_vectorizedMismatch(Intrinsic* x) {
|
||||
fatal("vectorizedMismatch intrinsic is not implemented on this platform");
|
||||
}
|
||||
|
@ -327,7 +327,7 @@ void InterpreterMacroAssembler::push_i(Register r) {
|
||||
|
||||
void InterpreterMacroAssembler::push_l(Register r) {
|
||||
str(zr, pre(esp, -wordSize));
|
||||
str(r, pre(esp, -wordsize));
|
||||
str(r, pre(esp, - wordSize));
|
||||
}
|
||||
|
||||
void InterpreterMacroAssembler::pop_f(FloatRegister r) {
|
||||
|
@ -262,6 +262,11 @@ void VM_Version::get_processor_features() {
|
||||
FLAG_SET_DEFAULT(UseCRC32CIntrinsics, false);
|
||||
}
|
||||
|
||||
if (UseFMA) {
|
||||
warning("FMA instructions are not available on this CPU");
|
||||
FLAG_SET_DEFAULT(UseFMA, false);
|
||||
}
|
||||
|
||||
if (auxv & (HWCAP_SHA1 | HWCAP_SHA2)) {
|
||||
if (FLAG_IS_DEFAULT(UseSHA)) {
|
||||
FLAG_SET_DEFAULT(UseSHA, true);
|
||||
|
@ -506,6 +506,8 @@ class Assembler : public AbstractAssembler {
|
||||
// Vector-Scalar (VSX) instruction support.
|
||||
LXVD2X_OPCODE = (31u << OPCODE_SHIFT | 844u << 1),
|
||||
STXVD2X_OPCODE = (31u << OPCODE_SHIFT | 972u << 1),
|
||||
MTVSRD_OPCODE = (31u << OPCODE_SHIFT | 179u << 1),
|
||||
MFVSRD_OPCODE = (31u << OPCODE_SHIFT | 51u << 1),
|
||||
|
||||
// Vector Permute and Formatting
|
||||
VPKPX_OPCODE = (4u << OPCODE_SHIFT | 782u ),
|
||||
@ -1573,6 +1575,9 @@ class Assembler : public AbstractAssembler {
|
||||
inline void stdu( Register d, int si16, Register s1);
|
||||
inline void stdux(Register s, Register a, Register b);
|
||||
|
||||
inline void st_ptr(Register d, int si16, Register s1);
|
||||
DEBUG_ONLY(inline void st_ptr(Register d, ByteSize b, Register s1);)
|
||||
|
||||
// PPC 1, section 3.3.13 Move To/From System Register Instructions
|
||||
inline void mtlr( Register s1);
|
||||
inline void mflr( Register d);
|
||||
@ -2099,6 +2104,8 @@ class Assembler : public AbstractAssembler {
|
||||
// Vector-Scalar (VSX) instructions.
|
||||
inline void lxvd2x( VectorSRegister d, Register a, Register b);
|
||||
inline void stxvd2x( VectorSRegister d, Register a, Register b);
|
||||
inline void mtvrd( VectorRegister d, Register a);
|
||||
inline void mfvrd( Register a, VectorRegister d);
|
||||
|
||||
// AES (introduced with Power 8)
|
||||
inline void vcipher( VectorRegister d, VectorRegister a, VectorRegister b);
|
||||
|
@ -349,6 +349,9 @@ inline void Assembler::stdx( Register d, Register s1, Register s2) { emit_int32(
|
||||
inline void Assembler::stdu( Register d, int si16, Register s1) { emit_int32(STDU_OPCODE | rs(d) | ds(si16) | rta0mem(s1));}
|
||||
inline void Assembler::stdux(Register s, Register a, Register b) { emit_int32(STDUX_OPCODE| rs(s) | rta0mem(a) | rb(b));}
|
||||
|
||||
inline void Assembler::st_ptr(Register d, int b, Register s1) { std(d, b, s1); }
|
||||
DEBUG_ONLY(inline void Assembler::st_ptr(Register d, ByteSize b, Register s1) { std(d, in_bytes(b), s1); })
|
||||
|
||||
// PPC 1, section 3.3.13 Move To/From System Register Instructions
|
||||
inline void Assembler::mtlr( Register s1) { emit_int32(MTLR_OPCODE | rs(s1)); }
|
||||
inline void Assembler::mflr( Register d ) { emit_int32(MFLR_OPCODE | rt(d)); }
|
||||
@ -733,6 +736,8 @@ inline void Assembler::lvsr( VectorRegister d, Register s1, Register s2) { emit
|
||||
// Vector-Scalar (VSX) instructions.
|
||||
inline void Assembler::lxvd2x (VectorSRegister d, Register s1, Register s2) { emit_int32( LXVD2X_OPCODE | vsrt(d) | ra(s1) | rb(s2)); }
|
||||
inline void Assembler::stxvd2x(VectorSRegister d, Register s1, Register s2) { emit_int32( STXVD2X_OPCODE | vsrt(d) | ra(s1) | rb(s2)); }
|
||||
inline void Assembler::mtvrd( VectorRegister d, Register a) { emit_int32( MTVSRD_OPCODE | vrt(d) | ra(a) | 1u); } // 1u: d is treated as Vector (VMX/Altivec).
|
||||
inline void Assembler::mfvrd( Register a, VectorRegister d) { emit_int32( MFVSRD_OPCODE | vrt(d) | ra(a) | 1u); } // 1u: d is treated as Vector (VMX/Altivec).
|
||||
|
||||
inline void Assembler::vpkpx( VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VPKPX_OPCODE | vrt(d) | vra(a) | vrb(b)); }
|
||||
inline void Assembler::vpkshss( VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VPKSHSS_OPCODE | vrt(d) | vra(a) | vrb(b)); }
|
||||
|
@ -157,10 +157,11 @@ LIR_Opr LIRGenerator::safepoint_poll_register() {
|
||||
LIR_Address* LIRGenerator::generate_address(LIR_Opr base, LIR_Opr index,
|
||||
int shift, int disp, BasicType type) {
|
||||
assert(base->is_register(), "must be");
|
||||
intx large_disp = disp;
|
||||
|
||||
// Accumulate fixed displacements.
|
||||
if (index->is_constant()) {
|
||||
disp += index->as_constant_ptr()->as_jint() << shift;
|
||||
large_disp += (intx)(index->as_constant_ptr()->as_jint()) << shift;
|
||||
index = LIR_OprFact::illegalOpr;
|
||||
}
|
||||
|
||||
@ -171,31 +172,31 @@ LIR_Address* LIRGenerator::generate_address(LIR_Opr base, LIR_Opr index,
|
||||
__ shift_left(index, shift, tmp);
|
||||
index = tmp;
|
||||
}
|
||||
if (disp != 0) {
|
||||
if (large_disp != 0) {
|
||||
LIR_Opr tmp = new_pointer_register();
|
||||
if (Assembler::is_simm16(disp)) {
|
||||
__ add(index, LIR_OprFact::intptrConst(disp), tmp);
|
||||
if (Assembler::is_simm16(large_disp)) {
|
||||
__ add(index, LIR_OprFact::intptrConst(large_disp), tmp);
|
||||
index = tmp;
|
||||
} else {
|
||||
__ move(LIR_OprFact::intptrConst(disp), tmp);
|
||||
__ move(LIR_OprFact::intptrConst(large_disp), tmp);
|
||||
__ add(tmp, index, tmp);
|
||||
index = tmp;
|
||||
}
|
||||
disp = 0;
|
||||
large_disp = 0;
|
||||
}
|
||||
} else if (!Assembler::is_simm16(disp)) {
|
||||
} else if (!Assembler::is_simm16(large_disp)) {
|
||||
// Index is illegal so replace it with the displacement loaded into a register.
|
||||
index = new_pointer_register();
|
||||
__ move(LIR_OprFact::intptrConst(disp), index);
|
||||
disp = 0;
|
||||
__ move(LIR_OprFact::intptrConst(large_disp), index);
|
||||
large_disp = 0;
|
||||
}
|
||||
|
||||
// At this point we either have base + index or base + displacement.
|
||||
if (disp == 0) {
|
||||
if (large_disp == 0) {
|
||||
return new LIR_Address(base, index, type);
|
||||
} else {
|
||||
assert(Assembler::is_simm16(disp), "must be");
|
||||
return new LIR_Address(base, disp, type);
|
||||
assert(Assembler::is_simm16(large_disp), "must be");
|
||||
return new LIR_Address(base, large_disp, type);
|
||||
}
|
||||
}
|
||||
|
||||
@ -206,11 +207,11 @@ LIR_Address* LIRGenerator::emit_array_address(LIR_Opr array_opr, LIR_Opr index_o
|
||||
int shift = exact_log2(elem_size);
|
||||
|
||||
LIR_Opr base_opr;
|
||||
int offset = arrayOopDesc::base_offset_in_bytes(type);
|
||||
intx offset = arrayOopDesc::base_offset_in_bytes(type);
|
||||
|
||||
if (index_opr->is_constant()) {
|
||||
int i = index_opr->as_constant_ptr()->as_jint();
|
||||
int array_offset = i * elem_size;
|
||||
intx i = index_opr->as_constant_ptr()->as_jint();
|
||||
intx array_offset = i * elem_size;
|
||||
if (Assembler::is_simm16(array_offset + offset)) {
|
||||
base_opr = array_opr;
|
||||
offset = array_offset + offset;
|
||||
@ -1433,6 +1434,10 @@ void LIRGenerator::do_update_CRC32(Intrinsic* x) {
|
||||
}
|
||||
}
|
||||
|
||||
void LIRGenerator::do_FmaIntrinsic(Intrinsic* x) {
|
||||
fatal("FMA intrinsic is not implemented on this platform");
|
||||
}
|
||||
|
||||
void LIRGenerator::do_vectorizedMismatch(Intrinsic* x) {
|
||||
fatal("vectorizedMismatch intrinsic is not implemented on this platform");
|
||||
}
|
||||
|
@ -261,6 +261,9 @@ void InterpreterMacroAssembler::push_ptr(Register r) {
|
||||
}
|
||||
|
||||
void InterpreterMacroAssembler::push_l(Register r) {
|
||||
// Clear unused slot.
|
||||
load_const_optimized(R0, 0L);
|
||||
std(R0, 0, R15_esp);
|
||||
std(r, - Interpreter::stackElementSize, R15_esp);
|
||||
addi(R15_esp, R15_esp, - 2 * Interpreter::stackElementSize );
|
||||
}
|
||||
|
@ -4332,6 +4332,565 @@ void MacroAssembler::kernel_crc32_1byte(Register crc, Register buf, Register len
|
||||
BLOCK_COMMENT("} kernel_crc32_1byte");
|
||||
}
|
||||
|
||||
/**
|
||||
* @param crc register containing existing CRC (32-bit)
|
||||
* @param buf register pointing to input byte buffer (byte*)
|
||||
* @param len register containing number of bytes
|
||||
* @param table register pointing to CRC table
|
||||
* @param constants register pointing to CRC table for 128-bit aligned memory
|
||||
* @param barretConstants register pointing to table for barrett reduction
|
||||
* @param t0 volatile register
|
||||
* @param t1 volatile register
|
||||
* @param t2 volatile register
|
||||
* @param t3 volatile register
|
||||
*/
|
||||
void MacroAssembler::kernel_crc32_1word_vpmsumd(Register crc, Register buf, Register len, Register table,
|
||||
Register constants, Register barretConstants,
|
||||
Register t0, Register t1, Register t2, Register t3, Register t4) {
|
||||
assert_different_registers(crc, buf, len, table);
|
||||
|
||||
Label L_alignedHead, L_tail, L_alignTail, L_start, L_end;
|
||||
|
||||
Register prealign = t0;
|
||||
Register postalign = t0;
|
||||
|
||||
BLOCK_COMMENT("kernel_crc32_1word_vpmsumb {");
|
||||
|
||||
// 1. use kernel_crc32_1word for shorter than 384bit
|
||||
clrldi(len, len, 32);
|
||||
cmpdi(CCR0, len, 384);
|
||||
bge(CCR0, L_start);
|
||||
|
||||
Register tc0 = t4;
|
||||
Register tc1 = constants;
|
||||
Register tc2 = barretConstants;
|
||||
kernel_crc32_1word(crc, buf, len, table,t0, t1, t2, t3, tc0, tc1, tc2, table);
|
||||
b(L_end);
|
||||
|
||||
BIND(L_start);
|
||||
|
||||
// 2. ~c
|
||||
nand(crc, crc, crc);
|
||||
|
||||
// 3. calculate from 0 to first 128bit-aligned address
|
||||
clrldi_(prealign, buf, 57);
|
||||
beq(CCR0, L_alignedHead);
|
||||
|
||||
subfic(prealign, prealign, 128);
|
||||
|
||||
subf(len, prealign, len);
|
||||
update_byteLoop_crc32(crc, buf, prealign, table, t2, false, false);
|
||||
|
||||
// 4. calculate from first 128bit-aligned address to last 128bit-aligned address
|
||||
BIND(L_alignedHead);
|
||||
|
||||
clrldi(postalign, len, 57);
|
||||
subf(len, postalign, len);
|
||||
|
||||
// len must be more than 256bit
|
||||
kernel_crc32_1word_aligned(crc, buf, len, constants, barretConstants, t1, t2, t3);
|
||||
|
||||
// 5. calculate remaining
|
||||
cmpdi(CCR0, postalign, 0);
|
||||
beq(CCR0, L_tail);
|
||||
|
||||
update_byteLoop_crc32(crc, buf, postalign, table, t2, false, false);
|
||||
|
||||
BIND(L_tail);
|
||||
|
||||
// 6. ~c
|
||||
nand(crc, crc, crc);
|
||||
|
||||
BIND(L_end);
|
||||
|
||||
BLOCK_COMMENT("} kernel_crc32_1word_vpmsumb");
|
||||
}
|
||||
|
||||
/**
|
||||
* @param crc register containing existing CRC (32-bit)
|
||||
* @param buf register pointing to input byte buffer (byte*)
|
||||
* @param len register containing number of bytes
|
||||
* @param constants register pointing to CRC table for 128-bit aligned memory
|
||||
* @param barretConstants register pointing to table for barrett reduction
|
||||
* @param t0 volatile register
|
||||
* @param t1 volatile register
|
||||
* @param t2 volatile register
|
||||
*/
|
||||
void MacroAssembler::kernel_crc32_1word_aligned(Register crc, Register buf, Register len,
|
||||
Register constants, Register barretConstants, Register t0, Register t1, Register t2) {
|
||||
Label L_mainLoop, L_tail, L_alignTail, L_barrett_reduction, L_end, L_first_warm_up_done, L_first_cool_down, L_second_cool_down, L_XOR, L_test;
|
||||
Label L_lv0, L_lv1, L_lv2, L_lv3, L_lv4, L_lv5, L_lv6, L_lv7, L_lv8, L_lv9, L_lv10, L_lv11, L_lv12, L_lv13, L_lv14, L_lv15;
|
||||
Label L_1, L_2, L_3, L_4;
|
||||
|
||||
Register rLoaded = t0;
|
||||
Register rTmp1 = t1;
|
||||
Register rTmp2 = t2;
|
||||
Register off16 = R22;
|
||||
Register off32 = R23;
|
||||
Register off48 = R24;
|
||||
Register off64 = R25;
|
||||
Register off80 = R26;
|
||||
Register off96 = R27;
|
||||
Register off112 = R28;
|
||||
Register rIdx = R29;
|
||||
Register rMax = R30;
|
||||
Register constantsPos = R31;
|
||||
|
||||
VectorRegister mask_32bit = VR24;
|
||||
VectorRegister mask_64bit = VR25;
|
||||
VectorRegister zeroes = VR26;
|
||||
VectorRegister const1 = VR27;
|
||||
VectorRegister const2 = VR28;
|
||||
|
||||
// Save non-volatile vector registers (frameless).
|
||||
Register offset = t1; int offsetInt = 0;
|
||||
offsetInt -= 16; li(offset, -16); stvx(VR20, offset, R1_SP);
|
||||
offsetInt -= 16; addi(offset, offset, -16); stvx(VR21, offset, R1_SP);
|
||||
offsetInt -= 16; addi(offset, offset, -16); stvx(VR22, offset, R1_SP);
|
||||
offsetInt -= 16; addi(offset, offset, -16); stvx(VR23, offset, R1_SP);
|
||||
offsetInt -= 16; addi(offset, offset, -16); stvx(VR24, offset, R1_SP);
|
||||
offsetInt -= 16; addi(offset, offset, -16); stvx(VR25, offset, R1_SP);
|
||||
offsetInt -= 16; addi(offset, offset, -16); stvx(VR26, offset, R1_SP);
|
||||
offsetInt -= 16; addi(offset, offset, -16); stvx(VR27, offset, R1_SP);
|
||||
offsetInt -= 16; addi(offset, offset, -16); stvx(VR28, offset, R1_SP);
|
||||
offsetInt -= 8; std(R22, offsetInt, R1_SP);
|
||||
offsetInt -= 8; std(R23, offsetInt, R1_SP);
|
||||
offsetInt -= 8; std(R24, offsetInt, R1_SP);
|
||||
offsetInt -= 8; std(R25, offsetInt, R1_SP);
|
||||
offsetInt -= 8; std(R26, offsetInt, R1_SP);
|
||||
offsetInt -= 8; std(R27, offsetInt, R1_SP);
|
||||
offsetInt -= 8; std(R28, offsetInt, R1_SP);
|
||||
offsetInt -= 8; std(R29, offsetInt, R1_SP);
|
||||
offsetInt -= 8; std(R30, offsetInt, R1_SP);
|
||||
offsetInt -= 8; std(R31, offsetInt, R1_SP);
|
||||
|
||||
// Set constants
|
||||
li(off16, 16);
|
||||
li(off32, 32);
|
||||
li(off48, 48);
|
||||
li(off64, 64);
|
||||
li(off80, 80);
|
||||
li(off96, 96);
|
||||
li(off112, 112);
|
||||
|
||||
clrldi(crc, crc, 32);
|
||||
|
||||
vxor(zeroes, zeroes, zeroes);
|
||||
vspltisw(VR0, -1);
|
||||
|
||||
vsldoi(mask_32bit, zeroes, VR0, 4);
|
||||
vsldoi(mask_64bit, zeroes, VR0, -8);
|
||||
|
||||
// Get the initial value into v8
|
||||
vxor(VR8, VR8, VR8);
|
||||
mtvrd(VR8, crc);
|
||||
vsldoi(VR8, zeroes, VR8, -8); // shift into bottom 32 bits
|
||||
|
||||
li (rLoaded, 0);
|
||||
|
||||
rldicr(rIdx, len, 0, 56);
|
||||
|
||||
{
|
||||
BIND(L_1);
|
||||
// Checksum in blocks of MAX_SIZE (32768)
|
||||
lis(rMax, 0);
|
||||
ori(rMax, rMax, 32768);
|
||||
mr(rTmp2, rMax);
|
||||
cmpd(CCR0, rIdx, rMax);
|
||||
bgt(CCR0, L_2);
|
||||
mr(rMax, rIdx);
|
||||
|
||||
BIND(L_2);
|
||||
subf(rIdx, rMax, rIdx);
|
||||
|
||||
// our main loop does 128 bytes at a time
|
||||
srdi(rMax, rMax, 7);
|
||||
|
||||
/*
|
||||
* Work out the offset into the constants table to start at. Each
|
||||
* constant is 16 bytes, and it is used against 128 bytes of input
|
||||
* data - 128 / 16 = 8
|
||||
*/
|
||||
sldi(rTmp1, rMax, 4);
|
||||
srdi(rTmp2, rTmp2, 3);
|
||||
subf(rTmp1, rTmp1, rTmp2);
|
||||
|
||||
// We reduce our final 128 bytes in a separate step
|
||||
addi(rMax, rMax, -1);
|
||||
mtctr(rMax);
|
||||
|
||||
// Find the start of our constants
|
||||
add(constantsPos, constants, rTmp1);
|
||||
|
||||
// zero VR0-v7 which will contain our checksums
|
||||
vxor(VR0, VR0, VR0);
|
||||
vxor(VR1, VR1, VR1);
|
||||
vxor(VR2, VR2, VR2);
|
||||
vxor(VR3, VR3, VR3);
|
||||
vxor(VR4, VR4, VR4);
|
||||
vxor(VR5, VR5, VR5);
|
||||
vxor(VR6, VR6, VR6);
|
||||
vxor(VR7, VR7, VR7);
|
||||
|
||||
lvx(const1, constantsPos);
|
||||
|
||||
/*
|
||||
* If we are looping back to consume more data we use the values
|
||||
* already in VR16-v23.
|
||||
*/
|
||||
cmpdi(CCR0, rLoaded, 1);
|
||||
beq(CCR0, L_3);
|
||||
{
|
||||
|
||||
// First warm up pass
|
||||
lvx(VR16, buf);
|
||||
lvx(VR17, off16, buf);
|
||||
lvx(VR18, off32, buf);
|
||||
lvx(VR19, off48, buf);
|
||||
lvx(VR20, off64, buf);
|
||||
lvx(VR21, off80, buf);
|
||||
lvx(VR22, off96, buf);
|
||||
lvx(VR23, off112, buf);
|
||||
addi(buf, buf, 8*16);
|
||||
|
||||
// xor in initial value
|
||||
vxor(VR16, VR16, VR8);
|
||||
}
|
||||
|
||||
BIND(L_3);
|
||||
bdz(L_first_warm_up_done);
|
||||
|
||||
addi(constantsPos, constantsPos, 16);
|
||||
lvx(const2, constantsPos);
|
||||
|
||||
// Second warm up pass
|
||||
vpmsumd(VR8, VR16, const1);
|
||||
lvx(VR16, buf);
|
||||
|
||||
vpmsumd(VR9, VR17, const1);
|
||||
lvx(VR17, off16, buf);
|
||||
|
||||
vpmsumd(VR10, VR18, const1);
|
||||
lvx(VR18, off32, buf);
|
||||
|
||||
vpmsumd(VR11, VR19, const1);
|
||||
lvx(VR19, off48, buf);
|
||||
|
||||
vpmsumd(VR12, VR20, const1);
|
||||
lvx(VR20, off64, buf);
|
||||
|
||||
vpmsumd(VR13, VR21, const1);
|
||||
lvx(VR21, off80, buf);
|
||||
|
||||
vpmsumd(VR14, VR22, const1);
|
||||
lvx(VR22, off96, buf);
|
||||
|
||||
vpmsumd(VR15, VR23, const1);
|
||||
lvx(VR23, off112, buf);
|
||||
|
||||
addi(buf, buf, 8 * 16);
|
||||
|
||||
bdz(L_first_cool_down);
|
||||
|
||||
/*
|
||||
* main loop. We modulo schedule it such that it takes three iterations
|
||||
* to complete - first iteration load, second iteration vpmsum, third
|
||||
* iteration xor.
|
||||
*/
|
||||
{
|
||||
BIND(L_4);
|
||||
lvx(const1, constantsPos); addi(constantsPos, constantsPos, 16);
|
||||
|
||||
vxor(VR0, VR0, VR8);
|
||||
vpmsumd(VR8, VR16, const2);
|
||||
lvx(VR16, buf);
|
||||
|
||||
vxor(VR1, VR1, VR9);
|
||||
vpmsumd(VR9, VR17, const2);
|
||||
lvx(VR17, off16, buf);
|
||||
|
||||
vxor(VR2, VR2, VR10);
|
||||
vpmsumd(VR10, VR18, const2);
|
||||
lvx(VR18, off32, buf);
|
||||
|
||||
vxor(VR3, VR3, VR11);
|
||||
vpmsumd(VR11, VR19, const2);
|
||||
lvx(VR19, off48, buf);
|
||||
lvx(const2, constantsPos);
|
||||
|
||||
vxor(VR4, VR4, VR12);
|
||||
vpmsumd(VR12, VR20, const1);
|
||||
lvx(VR20, off64, buf);
|
||||
|
||||
vxor(VR5, VR5, VR13);
|
||||
vpmsumd(VR13, VR21, const1);
|
||||
lvx(VR21, off80, buf);
|
||||
|
||||
vxor(VR6, VR6, VR14);
|
||||
vpmsumd(VR14, VR22, const1);
|
||||
lvx(VR22, off96, buf);
|
||||
|
||||
vxor(VR7, VR7, VR15);
|
||||
vpmsumd(VR15, VR23, const1);
|
||||
lvx(VR23, off112, buf);
|
||||
|
||||
addi(buf, buf, 8 * 16);
|
||||
|
||||
bdnz(L_4);
|
||||
}
|
||||
|
||||
BIND(L_first_cool_down);
|
||||
|
||||
// First cool down pass
|
||||
lvx(const1, constantsPos);
|
||||
addi(constantsPos, constantsPos, 16);
|
||||
|
||||
vxor(VR0, VR0, VR8);
|
||||
vpmsumd(VR8, VR16, const1);
|
||||
|
||||
vxor(VR1, VR1, VR9);
|
||||
vpmsumd(VR9, VR17, const1);
|
||||
|
||||
vxor(VR2, VR2, VR10);
|
||||
vpmsumd(VR10, VR18, const1);
|
||||
|
||||
vxor(VR3, VR3, VR11);
|
||||
vpmsumd(VR11, VR19, const1);
|
||||
|
||||
vxor(VR4, VR4, VR12);
|
||||
vpmsumd(VR12, VR20, const1);
|
||||
|
||||
vxor(VR5, VR5, VR13);
|
||||
vpmsumd(VR13, VR21, const1);
|
||||
|
||||
vxor(VR6, VR6, VR14);
|
||||
vpmsumd(VR14, VR22, const1);
|
||||
|
||||
vxor(VR7, VR7, VR15);
|
||||
vpmsumd(VR15, VR23, const1);
|
||||
|
||||
BIND(L_second_cool_down);
|
||||
// Second cool down pass
|
||||
vxor(VR0, VR0, VR8);
|
||||
vxor(VR1, VR1, VR9);
|
||||
vxor(VR2, VR2, VR10);
|
||||
vxor(VR3, VR3, VR11);
|
||||
vxor(VR4, VR4, VR12);
|
||||
vxor(VR5, VR5, VR13);
|
||||
vxor(VR6, VR6, VR14);
|
||||
vxor(VR7, VR7, VR15);
|
||||
|
||||
/*
|
||||
* vpmsumd produces a 96 bit result in the least significant bits
|
||||
* of the register. Since we are bit reflected we have to shift it
|
||||
* left 32 bits so it occupies the least significant bits in the
|
||||
* bit reflected domain.
|
||||
*/
|
||||
vsldoi(VR0, VR0, zeroes, 4);
|
||||
vsldoi(VR1, VR1, zeroes, 4);
|
||||
vsldoi(VR2, VR2, zeroes, 4);
|
||||
vsldoi(VR3, VR3, zeroes, 4);
|
||||
vsldoi(VR4, VR4, zeroes, 4);
|
||||
vsldoi(VR5, VR5, zeroes, 4);
|
||||
vsldoi(VR6, VR6, zeroes, 4);
|
||||
vsldoi(VR7, VR7, zeroes, 4);
|
||||
|
||||
// xor with last 1024 bits
|
||||
lvx(VR8, buf);
|
||||
lvx(VR9, off16, buf);
|
||||
lvx(VR10, off32, buf);
|
||||
lvx(VR11, off48, buf);
|
||||
lvx(VR12, off64, buf);
|
||||
lvx(VR13, off80, buf);
|
||||
lvx(VR14, off96, buf);
|
||||
lvx(VR15, off112, buf);
|
||||
addi(buf, buf, 8 * 16);
|
||||
|
||||
vxor(VR16, VR0, VR8);
|
||||
vxor(VR17, VR1, VR9);
|
||||
vxor(VR18, VR2, VR10);
|
||||
vxor(VR19, VR3, VR11);
|
||||
vxor(VR20, VR4, VR12);
|
||||
vxor(VR21, VR5, VR13);
|
||||
vxor(VR22, VR6, VR14);
|
||||
vxor(VR23, VR7, VR15);
|
||||
|
||||
li(rLoaded, 1);
|
||||
cmpdi(CCR0, rIdx, 0);
|
||||
addi(rIdx, rIdx, 128);
|
||||
bne(CCR0, L_1);
|
||||
}
|
||||
|
||||
// Work out how many bytes we have left
|
||||
andi_(len, len, 127);
|
||||
|
||||
// Calculate where in the constant table we need to start
|
||||
subfic(rTmp1, len, 128);
|
||||
add(constantsPos, constantsPos, rTmp1);
|
||||
|
||||
// How many 16 byte chunks are in the tail
|
||||
srdi(rIdx, len, 4);
|
||||
mtctr(rIdx);
|
||||
|
||||
/*
|
||||
* Reduce the previously calculated 1024 bits to 64 bits, shifting
|
||||
* 32 bits to include the trailing 32 bits of zeros
|
||||
*/
|
||||
lvx(VR0, constantsPos);
|
||||
lvx(VR1, off16, constantsPos);
|
||||
lvx(VR2, off32, constantsPos);
|
||||
lvx(VR3, off48, constantsPos);
|
||||
lvx(VR4, off64, constantsPos);
|
||||
lvx(VR5, off80, constantsPos);
|
||||
lvx(VR6, off96, constantsPos);
|
||||
lvx(VR7, off112, constantsPos);
|
||||
addi(constantsPos, constantsPos, 8 * 16);
|
||||
|
||||
vpmsumw(VR0, VR16, VR0);
|
||||
vpmsumw(VR1, VR17, VR1);
|
||||
vpmsumw(VR2, VR18, VR2);
|
||||
vpmsumw(VR3, VR19, VR3);
|
||||
vpmsumw(VR4, VR20, VR4);
|
||||
vpmsumw(VR5, VR21, VR5);
|
||||
vpmsumw(VR6, VR22, VR6);
|
||||
vpmsumw(VR7, VR23, VR7);
|
||||
|
||||
// Now reduce the tail (0 - 112 bytes)
|
||||
cmpdi(CCR0, rIdx, 0);
|
||||
beq(CCR0, L_XOR);
|
||||
|
||||
lvx(VR16, buf); addi(buf, buf, 16);
|
||||
lvx(VR17, constantsPos);
|
||||
vpmsumw(VR16, VR16, VR17);
|
||||
vxor(VR0, VR0, VR16);
|
||||
beq(CCR0, L_XOR);
|
||||
|
||||
lvx(VR16, buf); addi(buf, buf, 16);
|
||||
lvx(VR17, off16, constantsPos);
|
||||
vpmsumw(VR16, VR16, VR17);
|
||||
vxor(VR0, VR0, VR16);
|
||||
beq(CCR0, L_XOR);
|
||||
|
||||
lvx(VR16, buf); addi(buf, buf, 16);
|
||||
lvx(VR17, off32, constantsPos);
|
||||
vpmsumw(VR16, VR16, VR17);
|
||||
vxor(VR0, VR0, VR16);
|
||||
beq(CCR0, L_XOR);
|
||||
|
||||
lvx(VR16, buf); addi(buf, buf, 16);
|
||||
lvx(VR17, off48,constantsPos);
|
||||
vpmsumw(VR16, VR16, VR17);
|
||||
vxor(VR0, VR0, VR16);
|
||||
beq(CCR0, L_XOR);
|
||||
|
||||
lvx(VR16, buf); addi(buf, buf, 16);
|
||||
lvx(VR17, off64, constantsPos);
|
||||
vpmsumw(VR16, VR16, VR17);
|
||||
vxor(VR0, VR0, VR16);
|
||||
beq(CCR0, L_XOR);
|
||||
|
||||
lvx(VR16, buf); addi(buf, buf, 16);
|
||||
lvx(VR17, off80, constantsPos);
|
||||
vpmsumw(VR16, VR16, VR17);
|
||||
vxor(VR0, VR0, VR16);
|
||||
beq(CCR0, L_XOR);
|
||||
|
||||
lvx(VR16, buf); addi(buf, buf, 16);
|
||||
lvx(VR17, off96, constantsPos);
|
||||
vpmsumw(VR16, VR16, VR17);
|
||||
vxor(VR0, VR0, VR16);
|
||||
|
||||
// Now xor all the parallel chunks together
|
||||
BIND(L_XOR);
|
||||
vxor(VR0, VR0, VR1);
|
||||
vxor(VR2, VR2, VR3);
|
||||
vxor(VR4, VR4, VR5);
|
||||
vxor(VR6, VR6, VR7);
|
||||
|
||||
vxor(VR0, VR0, VR2);
|
||||
vxor(VR4, VR4, VR6);
|
||||
|
||||
vxor(VR0, VR0, VR4);
|
||||
|
||||
b(L_barrett_reduction);
|
||||
|
||||
BIND(L_first_warm_up_done);
|
||||
lvx(const1, constantsPos);
|
||||
addi(constantsPos, constantsPos, 16);
|
||||
vpmsumd(VR8, VR16, const1);
|
||||
vpmsumd(VR9, VR17, const1);
|
||||
vpmsumd(VR10, VR18, const1);
|
||||
vpmsumd(VR11, VR19, const1);
|
||||
vpmsumd(VR12, VR20, const1);
|
||||
vpmsumd(VR13, VR21, const1);
|
||||
vpmsumd(VR14, VR22, const1);
|
||||
vpmsumd(VR15, VR23, const1);
|
||||
b(L_second_cool_down);
|
||||
|
||||
BIND(L_barrett_reduction);
|
||||
|
||||
lvx(const1, barretConstants);
|
||||
addi(barretConstants, barretConstants, 16);
|
||||
lvx(const2, barretConstants);
|
||||
|
||||
vsldoi(VR1, VR0, VR0, -8);
|
||||
vxor(VR0, VR0, VR1); // xor two 64 bit results together
|
||||
|
||||
// shift left one bit
|
||||
vspltisb(VR1, 1);
|
||||
vsl(VR0, VR0, VR1);
|
||||
|
||||
vand(VR0, VR0, mask_64bit);
|
||||
|
||||
/*
|
||||
* The reflected version of Barrett reduction. Instead of bit
|
||||
* reflecting our data (which is expensive to do), we bit reflect our
|
||||
* constants and our algorithm, which means the intermediate data in
|
||||
* our vector registers goes from 0-63 instead of 63-0. We can reflect
|
||||
* the algorithm because we don't carry in mod 2 arithmetic.
|
||||
*/
|
||||
vand(VR1, VR0, mask_32bit); // bottom 32 bits of a
|
||||
vpmsumd(VR1, VR1, const1); // ma
|
||||
vand(VR1, VR1, mask_32bit); // bottom 32bits of ma
|
||||
vpmsumd(VR1, VR1, const2); // qn */
|
||||
vxor(VR0, VR0, VR1); // a - qn, subtraction is xor in GF(2)
|
||||
|
||||
/*
|
||||
* Since we are bit reflected, the result (ie the low 32 bits) is in
|
||||
* the high 32 bits. We just need to shift it left 4 bytes
|
||||
* V0 [ 0 1 X 3 ]
|
||||
* V0 [ 0 X 2 3 ]
|
||||
*/
|
||||
vsldoi(VR0, VR0, zeroes, 4); // shift result into top 64 bits of
|
||||
|
||||
// Get it into r3
|
||||
mfvrd(crc, VR0);
|
||||
|
||||
BIND(L_end);
|
||||
|
||||
offsetInt = 0;
|
||||
// Restore non-volatile Vector registers (frameless).
|
||||
offsetInt -= 16; li(offset, -16); lvx(VR20, offset, R1_SP);
|
||||
offsetInt -= 16; addi(offset, offset, -16); lvx(VR21, offset, R1_SP);
|
||||
offsetInt -= 16; addi(offset, offset, -16); lvx(VR22, offset, R1_SP);
|
||||
offsetInt -= 16; addi(offset, offset, -16); lvx(VR23, offset, R1_SP);
|
||||
offsetInt -= 16; addi(offset, offset, -16); lvx(VR24, offset, R1_SP);
|
||||
offsetInt -= 16; addi(offset, offset, -16); lvx(VR25, offset, R1_SP);
|
||||
offsetInt -= 16; addi(offset, offset, -16); lvx(VR26, offset, R1_SP);
|
||||
offsetInt -= 16; addi(offset, offset, -16); lvx(VR27, offset, R1_SP);
|
||||
offsetInt -= 16; addi(offset, offset, -16); lvx(VR28, offset, R1_SP);
|
||||
offsetInt -= 8; ld(R22, offsetInt, R1_SP);
|
||||
offsetInt -= 8; ld(R23, offsetInt, R1_SP);
|
||||
offsetInt -= 8; ld(R24, offsetInt, R1_SP);
|
||||
offsetInt -= 8; ld(R25, offsetInt, R1_SP);
|
||||
offsetInt -= 8; ld(R26, offsetInt, R1_SP);
|
||||
offsetInt -= 8; ld(R27, offsetInt, R1_SP);
|
||||
offsetInt -= 8; ld(R28, offsetInt, R1_SP);
|
||||
offsetInt -= 8; ld(R29, offsetInt, R1_SP);
|
||||
offsetInt -= 8; ld(R30, offsetInt, R1_SP);
|
||||
offsetInt -= 8; ld(R31, offsetInt, R1_SP);
|
||||
}
|
||||
|
||||
void MacroAssembler::kernel_crc32_singleByte(Register crc, Register buf, Register len, Register table, Register tmp) {
|
||||
assert_different_registers(crc, buf, /* len, not used!! */ table, tmp);
|
||||
|
||||
|
@ -834,6 +834,13 @@ class MacroAssembler: public Assembler {
|
||||
Register tc0, Register tc1, Register tc2, Register tc3);
|
||||
void kernel_crc32_1byte(Register crc, Register buf, Register len, Register table,
|
||||
Register t0, Register t1, Register t2, Register t3);
|
||||
void kernel_crc32_1word_vpmsumd(Register crc, Register buf, Register len, Register table,
|
||||
Register constants, Register barretConstants,
|
||||
Register t0, Register t1, Register t2, Register t3, Register t4);
|
||||
void kernel_crc32_1word_aligned(Register crc, Register buf, Register len,
|
||||
Register constants, Register barretConstants,
|
||||
Register t0, Register t1, Register t2);
|
||||
|
||||
void kernel_crc32_singleByte(Register crc, Register buf, Register len, Register table, Register tmp);
|
||||
|
||||
//
|
||||
|
@ -2489,6 +2489,11 @@ nmethod *SharedRuntime::generate_native_wrapper(MacroAssembler *masm,
|
||||
__ verify_oop(R3_RET);
|
||||
}
|
||||
|
||||
if (CheckJNICalls) {
|
||||
// clear_pending_jni_exception_check
|
||||
__ load_const_optimized(R0, 0L);
|
||||
__ st_ptr(R0, JavaThread::pending_jni_exception_check_fn_offset(), R16_thread);
|
||||
}
|
||||
|
||||
// Reset handle block.
|
||||
// --------------------------------------------------------------------------
|
||||
|
@ -3205,28 +3205,59 @@ class StubGenerator: public StubCodeGenerator {
|
||||
const Register crc = R3_ARG1; // Current checksum, preset by caller or result from previous call.
|
||||
const Register data = R4_ARG2; // source byte array
|
||||
const Register dataLen = R5_ARG3; // #bytes to process
|
||||
const Register table = R6_ARG4; // crc table address
|
||||
|
||||
const Register t0 = R2;
|
||||
const Register t1 = R7;
|
||||
const Register t2 = R8;
|
||||
const Register t3 = R9;
|
||||
const Register tc0 = R10;
|
||||
const Register tc1 = R11;
|
||||
const Register tc2 = R12;
|
||||
const Register table = R6; // crc table address
|
||||
|
||||
BLOCK_COMMENT("Stub body {");
|
||||
assert_different_registers(crc, data, dataLen, table);
|
||||
#ifdef VM_LITTLE_ENDIAN
|
||||
if (VM_Version::has_vpmsumb()) {
|
||||
const Register constants = R2; // constants address
|
||||
const Register bconstants = R8; // barret table address
|
||||
|
||||
StubRoutines::ppc64::generate_load_crc_table_addr(_masm, table);
|
||||
const Register t0 = R9;
|
||||
const Register t1 = R10;
|
||||
const Register t2 = R11;
|
||||
const Register t3 = R12;
|
||||
const Register t4 = R7;
|
||||
|
||||
__ kernel_crc32_1word(crc, data, dataLen, table, t0, t1, t2, t3, tc0, tc1, tc2, table);
|
||||
BLOCK_COMMENT("Stub body {");
|
||||
assert_different_registers(crc, data, dataLen, table);
|
||||
|
||||
BLOCK_COMMENT("return");
|
||||
__ mr_if_needed(R3_RET, crc); // Updated crc is function result. No copying required (R3_ARG1 == R3_RET).
|
||||
__ blr();
|
||||
StubRoutines::ppc64::generate_load_crc_table_addr(_masm, table);
|
||||
StubRoutines::ppc64::generate_load_crc_constants_addr(_masm, constants);
|
||||
StubRoutines::ppc64::generate_load_crc_barret_constants_addr(_masm, bconstants);
|
||||
|
||||
__ kernel_crc32_1word_vpmsumd(crc, data, dataLen, table, constants, bconstants, t0, t1, t2, t3, t4);
|
||||
|
||||
BLOCK_COMMENT("return");
|
||||
__ mr_if_needed(R3_RET, crc); // Updated crc is function result. No copying required (R3_ARG1 == R3_RET).
|
||||
__ blr();
|
||||
|
||||
BLOCK_COMMENT("} Stub body");
|
||||
} else
|
||||
#endif
|
||||
{
|
||||
const Register t0 = R2;
|
||||
const Register t1 = R7;
|
||||
const Register t2 = R8;
|
||||
const Register t3 = R9;
|
||||
const Register tc0 = R10;
|
||||
const Register tc1 = R11;
|
||||
const Register tc2 = R12;
|
||||
|
||||
BLOCK_COMMENT("Stub body {");
|
||||
assert_different_registers(crc, data, dataLen, table);
|
||||
|
||||
StubRoutines::ppc64::generate_load_crc_table_addr(_masm, table);
|
||||
|
||||
__ kernel_crc32_1word(crc, data, dataLen, table, t0, t1, t2, t3, tc0, tc1, tc2, table);
|
||||
|
||||
BLOCK_COMMENT("return");
|
||||
__ mr_if_needed(R3_RET, crc); // Updated crc is function result. No copying required (R3_ARG1 == R3_RET).
|
||||
__ blr();
|
||||
|
||||
BLOCK_COMMENT("} Stub body");
|
||||
}
|
||||
|
||||
BLOCK_COMMENT("} Stub body");
|
||||
return start;
|
||||
}
|
||||
|
||||
|
@ -45,6 +45,8 @@ enum platform_dependent_constants {
|
||||
#else
|
||||
#define CRC32_TABLES 1
|
||||
#endif
|
||||
#define CRC32_CONSTANTS_SIZE 1084
|
||||
#define CRC32_BARRET_CONSTANTS 10
|
||||
|
||||
class ppc64 {
|
||||
friend class StubGenerator;
|
||||
@ -53,11 +55,17 @@ class ppc64 {
|
||||
|
||||
// CRC32 Intrinsics.
|
||||
static juint _crc_table[CRC32_TABLES][CRC32_COLUMN_SIZE];
|
||||
static juint* _constants;
|
||||
static juint* _barret_constants;
|
||||
|
||||
public:
|
||||
|
||||
// CRC32 Intrinsics.
|
||||
static void generate_load_crc_table_addr(MacroAssembler* masm, Register table);
|
||||
static void generate_load_crc_constants_addr(MacroAssembler* masm, Register table);
|
||||
static void generate_load_crc_barret_constants_addr(MacroAssembler* masm, Register table);
|
||||
static juint* generate_crc_constants();
|
||||
static juint* generate_crc_barret_constants();
|
||||
|
||||
};
|
||||
|
||||
|
@ -37,6 +37,311 @@ void StubRoutines::ppc64::generate_load_crc_table_addr(MacroAssembler* masm, Reg
|
||||
__ load_const_optimized(table, StubRoutines::_crc_table_adr, R0);
|
||||
}
|
||||
|
||||
void StubRoutines::ppc64::generate_load_crc_constants_addr(MacroAssembler* masm, Register table) {
|
||||
__ load_const_optimized(table, (address)StubRoutines::ppc64::_constants, R0);
|
||||
}
|
||||
|
||||
void StubRoutines::ppc64::generate_load_crc_barret_constants_addr(MacroAssembler* masm, Register table) {
|
||||
__ load_const_optimized(table, (address)StubRoutines::ppc64::_barret_constants, R0);
|
||||
}
|
||||
|
||||
juint* StubRoutines::ppc64::generate_crc_constants() {
|
||||
juint constants[CRC32_CONSTANTS_SIZE] = {
|
||||
// Reduce 262144 kbits to 1024 bits
|
||||
0x99ea94a8UL, 0x00000000UL, 0x651797d2UL, 0x00000001UL, // x^261120 mod p(x)` << 1, x^261184 mod p(x)` << 1
|
||||
0x945a8420UL, 0x00000000UL, 0x21e0d56cUL, 0x00000000UL, // x^260096 mod p(x)` << 1, x^260160 mod p(x)` << 1
|
||||
0x30762706UL, 0x00000000UL, 0x0f95ecaaUL, 0x00000000UL, // x^259072 mod p(x)` << 1, x^259136 mod p(x)` << 1
|
||||
0xa52fc582UL, 0x00000001UL, 0xebd224acUL, 0x00000001UL, // x^258048 mod p(x)` << 1, x^258112 mod p(x)` << 1
|
||||
0xa4a7167aUL, 0x00000001UL, 0x0ccb97caUL, 0x00000000UL, // x^257024 mod p(x)` << 1, x^257088 mod p(x)` << 1
|
||||
0x0c18249aUL, 0x00000000UL, 0x006ec8a8UL, 0x00000001UL, // x^256000 mod p(x)` << 1, x^256064 mod p(x)` << 1
|
||||
0xa924ae7cUL, 0x00000000UL, 0x4f58f196UL, 0x00000001UL, // x^254976 mod p(x)` << 1, x^255040 mod p(x)` << 1
|
||||
0xe12ccc12UL, 0x00000001UL, 0xa7192ca6UL, 0x00000001UL, // x^253952 mod p(x)` << 1, x^254016 mod p(x)` << 1
|
||||
0xa0b9d4acUL, 0x00000000UL, 0x9a64bab2UL, 0x00000001UL, // x^252928 mod p(x)` << 1, x^252992 mod p(x)` << 1
|
||||
0x95e8ddfeUL, 0x00000000UL, 0x14f4ed2eUL, 0x00000000UL, // x^251904 mod p(x)` << 1, x^251968 mod p(x)` << 1
|
||||
0x233fddc4UL, 0x00000000UL, 0x1092b6a2UL, 0x00000001UL, // x^250880 mod p(x)` << 1, x^250944 mod p(x)` << 1
|
||||
0xb4529b62UL, 0x00000001UL, 0xc8a1629cUL, 0x00000000UL, // x^249856 mod p(x)` << 1, x^249920 mod p(x)` << 1
|
||||
0xa7fa0e64UL, 0x00000001UL, 0x7bf32e8eUL, 0x00000001UL, // x^248832 mod p(x)` << 1, x^248896 mod p(x)` << 1
|
||||
0xb5334592UL, 0x00000001UL, 0xf8cc6582UL, 0x00000001UL, // x^247808 mod p(x)` << 1, x^247872 mod p(x)` << 1
|
||||
0x1f8ee1b4UL, 0x00000001UL, 0x8631ddf0UL, 0x00000000UL, // x^246784 mod p(x)` << 1, x^246848 mod p(x)` << 1
|
||||
0x6252e632UL, 0x00000000UL, 0x7e5a76d0UL, 0x00000000UL, // x^245760 mod p(x)` << 1, x^245824 mod p(x)` << 1
|
||||
0xab973e84UL, 0x00000000UL, 0x2b09b31cUL, 0x00000000UL, // x^244736 mod p(x)` << 1, x^244800 mod p(x)` << 1
|
||||
0x7734f5ecUL, 0x00000000UL, 0xb2df1f84UL, 0x00000001UL, // x^243712 mod p(x)` << 1, x^243776 mod p(x)` << 1
|
||||
0x7c547798UL, 0x00000000UL, 0xd6f56afcUL, 0x00000001UL, // x^242688 mod p(x)` << 1, x^242752 mod p(x)` << 1
|
||||
0x7ec40210UL, 0x00000000UL, 0xb9b5e70cUL, 0x00000001UL, // x^241664 mod p(x)` << 1, x^241728 mod p(x)` << 1
|
||||
0xab1695a8UL, 0x00000001UL, 0x34b626d2UL, 0x00000000UL, // x^240640 mod p(x)` << 1, x^240704 mod p(x)` << 1
|
||||
0x90494bbaUL, 0x00000000UL, 0x4c53479aUL, 0x00000001UL, // x^239616 mod p(x)` << 1, x^239680 mod p(x)` << 1
|
||||
0x123fb816UL, 0x00000001UL, 0xa6d179a4UL, 0x00000001UL, // x^238592 mod p(x)` << 1, x^238656 mod p(x)` << 1
|
||||
0xe188c74cUL, 0x00000001UL, 0x5abd16b4UL, 0x00000001UL, // x^237568 mod p(x)` << 1, x^237632 mod p(x)` << 1
|
||||
0xc2d3451cUL, 0x00000001UL, 0x018f9852UL, 0x00000000UL, // x^236544 mod p(x)` << 1, x^236608 mod p(x)` << 1
|
||||
0xf55cf1caUL, 0x00000000UL, 0x1fb3084aUL, 0x00000000UL, // x^235520 mod p(x)` << 1, x^235584 mod p(x)` << 1
|
||||
0xa0531540UL, 0x00000001UL, 0xc53dfb04UL, 0x00000000UL, // x^234496 mod p(x)` << 1, x^234560 mod p(x)` << 1
|
||||
0x32cd7ebcUL, 0x00000001UL, 0xe10c9ad6UL, 0x00000000UL, // x^233472 mod p(x)` << 1, x^233536 mod p(x)` << 1
|
||||
0x73ab7f36UL, 0x00000000UL, 0x25aa994aUL, 0x00000000UL, // x^232448 mod p(x)` << 1, x^232512 mod p(x)` << 1
|
||||
0x41aed1c2UL, 0x00000000UL, 0xfa3a74c4UL, 0x00000000UL, // x^231424 mod p(x)` << 1, x^231488 mod p(x)` << 1
|
||||
0x36c53800UL, 0x00000001UL, 0x33eb3f40UL, 0x00000000UL, // x^230400 mod p(x)` << 1, x^230464 mod p(x)` << 1
|
||||
0x26835a30UL, 0x00000001UL, 0x7193f296UL, 0x00000001UL, // x^229376 mod p(x)` << 1, x^229440 mod p(x)` << 1
|
||||
0x6241b502UL, 0x00000000UL, 0x43f6c86aUL, 0x00000000UL, // x^228352 mod p(x)` << 1, x^228416 mod p(x)` << 1
|
||||
0xd5196ad4UL, 0x00000000UL, 0x6b513ec6UL, 0x00000001UL, // x^227328 mod p(x)` << 1, x^227392 mod p(x)` << 1
|
||||
0x9cfa769aUL, 0x00000000UL, 0xc8f25b4eUL, 0x00000000UL, // x^226304 mod p(x)` << 1, x^226368 mod p(x)` << 1
|
||||
0x920e5df4UL, 0x00000000UL, 0xa45048ecUL, 0x00000001UL, // x^225280 mod p(x)` << 1, x^225344 mod p(x)` << 1
|
||||
0x69dc310eUL, 0x00000001UL, 0x0c441004UL, 0x00000000UL, // x^224256 mod p(x)` << 1, x^224320 mod p(x)` << 1
|
||||
0x09fc331cUL, 0x00000000UL, 0x0e17cad6UL, 0x00000000UL, // x^223232 mod p(x)` << 1, x^223296 mod p(x)` << 1
|
||||
0x0d94a81eUL, 0x00000001UL, 0x253ae964UL, 0x00000001UL, // x^222208 mod p(x)` << 1, x^222272 mod p(x)` << 1
|
||||
0x27a20ab2UL, 0x00000000UL, 0xd7c88ebcUL, 0x00000001UL, // x^221184 mod p(x)` << 1, x^221248 mod p(x)` << 1
|
||||
0x14f87504UL, 0x00000001UL, 0xe7ca913aUL, 0x00000001UL, // x^220160 mod p(x)` << 1, x^220224 mod p(x)` << 1
|
||||
0x4b076d96UL, 0x00000000UL, 0x33ed078aUL, 0x00000000UL, // x^219136 mod p(x)` << 1, x^219200 mod p(x)` << 1
|
||||
0xda4d1e74UL, 0x00000000UL, 0xe1839c78UL, 0x00000000UL, // x^218112 mod p(x)` << 1, x^218176 mod p(x)` << 1
|
||||
0x1b81f672UL, 0x00000000UL, 0x322b267eUL, 0x00000001UL, // x^217088 mod p(x)` << 1, x^217152 mod p(x)` << 1
|
||||
0x9367c988UL, 0x00000000UL, 0x638231b6UL, 0x00000000UL, // x^216064 mod p(x)` << 1, x^216128 mod p(x)` << 1
|
||||
0x717214caUL, 0x00000001UL, 0xee7f16f4UL, 0x00000001UL, // x^215040 mod p(x)` << 1, x^215104 mod p(x)` << 1
|
||||
0x9f47d820UL, 0x00000000UL, 0x17d9924aUL, 0x00000001UL, // x^214016 mod p(x)` << 1, x^214080 mod p(x)` << 1
|
||||
0x0d9a47d2UL, 0x00000001UL, 0xe1a9e0c4UL, 0x00000000UL, // x^212992 mod p(x)` << 1, x^213056 mod p(x)` << 1
|
||||
0xa696c58cUL, 0x00000000UL, 0x403731dcUL, 0x00000001UL, // x^211968 mod p(x)` << 1, x^212032 mod p(x)` << 1
|
||||
0x2aa28ec6UL, 0x00000000UL, 0xa5ea9682UL, 0x00000001UL, // x^210944 mod p(x)` << 1, x^211008 mod p(x)` << 1
|
||||
0xfe18fd9aUL, 0x00000001UL, 0x01c5c578UL, 0x00000001UL, // x^209920 mod p(x)` << 1, x^209984 mod p(x)` << 1
|
||||
0x9d4fc1aeUL, 0x00000001UL, 0xdddf6494UL, 0x00000000UL, // x^208896 mod p(x)` << 1, x^208960 mod p(x)` << 1
|
||||
0xba0e3deaUL, 0x00000001UL, 0xf1c3db28UL, 0x00000000UL, // x^207872 mod p(x)` << 1, x^207936 mod p(x)` << 1
|
||||
0x74b59a5eUL, 0x00000000UL, 0x3112fb9cUL, 0x00000001UL, // x^206848 mod p(x)` << 1, x^206912 mod p(x)` << 1
|
||||
0xf2b5ea98UL, 0x00000000UL, 0xb680b906UL, 0x00000000UL, // x^205824 mod p(x)` << 1, x^205888 mod p(x)` << 1
|
||||
0x87132676UL, 0x00000001UL, 0x1a282932UL, 0x00000000UL, // x^204800 mod p(x)` << 1, x^204864 mod p(x)` << 1
|
||||
0x0a8c6ad4UL, 0x00000001UL, 0x89406e7eUL, 0x00000000UL, // x^203776 mod p(x)` << 1, x^203840 mod p(x)` << 1
|
||||
0xe21dfe70UL, 0x00000001UL, 0xdef6be8cUL, 0x00000001UL, // x^202752 mod p(x)` << 1, x^202816 mod p(x)` << 1
|
||||
0xda0050e4UL, 0x00000001UL, 0x75258728UL, 0x00000000UL, // x^201728 mod p(x)` << 1, x^201792 mod p(x)` << 1
|
||||
0x772172aeUL, 0x00000000UL, 0x9536090aUL, 0x00000001UL, // x^200704 mod p(x)` << 1, x^200768 mod p(x)` << 1
|
||||
0xe47724aaUL, 0x00000000UL, 0xf2455bfcUL, 0x00000000UL, // x^199680 mod p(x)` << 1, x^199744 mod p(x)` << 1
|
||||
0x3cd63ac4UL, 0x00000000UL, 0x8c40baf4UL, 0x00000001UL, // x^198656 mod p(x)` << 1, x^198720 mod p(x)` << 1
|
||||
0xbf47d352UL, 0x00000001UL, 0x4cd390d4UL, 0x00000000UL, // x^197632 mod p(x)` << 1, x^197696 mod p(x)` << 1
|
||||
0x8dc1d708UL, 0x00000001UL, 0xe4ece95aUL, 0x00000001UL, // x^196608 mod p(x)` << 1, x^196672 mod p(x)` << 1
|
||||
0x2d4620a4UL, 0x00000000UL, 0x1a3ee918UL, 0x00000000UL, // x^195584 mod p(x)` << 1, x^195648 mod p(x)` << 1
|
||||
0x58fd1740UL, 0x00000000UL, 0x7c652fb8UL, 0x00000000UL, // x^194560 mod p(x)` << 1, x^194624 mod p(x)` << 1
|
||||
0xdadd9bfcUL, 0x00000000UL, 0x1c67842cUL, 0x00000001UL, // x^193536 mod p(x)` << 1, x^193600 mod p(x)` << 1
|
||||
0xea2140beUL, 0x00000001UL, 0x254f759cUL, 0x00000000UL, // x^192512 mod p(x)` << 1, x^192576 mod p(x)` << 1
|
||||
0x9de128baUL, 0x00000000UL, 0x7ece94caUL, 0x00000000UL, // x^191488 mod p(x)` << 1, x^191552 mod p(x)` << 1
|
||||
0x3ac3aa8eUL, 0x00000001UL, 0x38f258c2UL, 0x00000000UL, // x^190464 mod p(x)` << 1, x^190528 mod p(x)` << 1
|
||||
0x99980562UL, 0x00000000UL, 0xcdf17b00UL, 0x00000001UL, // x^189440 mod p(x)` << 1, x^189504 mod p(x)` << 1
|
||||
0xc1579c86UL, 0x00000001UL, 0x1f882c16UL, 0x00000001UL, // x^188416 mod p(x)` << 1, x^188480 mod p(x)` << 1
|
||||
0x68dbbf94UL, 0x00000000UL, 0x00093fc8UL, 0x00000001UL, // x^187392 mod p(x)` << 1, x^187456 mod p(x)` << 1
|
||||
0x4509fb04UL, 0x00000000UL, 0xcd684f16UL, 0x00000001UL, // x^186368 mod p(x)` << 1, x^186432 mod p(x)` << 1
|
||||
0x202f6398UL, 0x00000001UL, 0x4bc6a70aUL, 0x00000000UL, // x^185344 mod p(x)` << 1, x^185408 mod p(x)` << 1
|
||||
0x3aea243eUL, 0x00000001UL, 0x4fc7e8e4UL, 0x00000000UL, // x^184320 mod p(x)` << 1, x^184384 mod p(x)` << 1
|
||||
0xb4052ae6UL, 0x00000001UL, 0x30103f1cUL, 0x00000001UL, // x^183296 mod p(x)` << 1, x^183360 mod p(x)` << 1
|
||||
0xcd2a0ae8UL, 0x00000001UL, 0x11b0024cUL, 0x00000001UL, // x^182272 mod p(x)` << 1, x^182336 mod p(x)` << 1
|
||||
0xfe4aa8b4UL, 0x00000001UL, 0x0b3079daUL, 0x00000001UL, // x^181248 mod p(x)` << 1, x^181312 mod p(x)` << 1
|
||||
0xd1559a42UL, 0x00000001UL, 0x0192bcc2UL, 0x00000001UL, // x^180224 mod p(x)` << 1, x^180288 mod p(x)` << 1
|
||||
0xf3e05eccUL, 0x00000001UL, 0x74838d50UL, 0x00000000UL, // x^179200 mod p(x)` << 1, x^179264 mod p(x)` << 1
|
||||
0x04ddd2ccUL, 0x00000001UL, 0x1b20f520UL, 0x00000000UL, // x^178176 mod p(x)` << 1, x^178240 mod p(x)` << 1
|
||||
0x5393153cUL, 0x00000001UL, 0x50c3590aUL, 0x00000000UL, // x^177152 mod p(x)` << 1, x^177216 mod p(x)` << 1
|
||||
0x57e942c6UL, 0x00000000UL, 0xb41cac8eUL, 0x00000000UL, // x^176128 mod p(x)` << 1, x^176192 mod p(x)` << 1
|
||||
0x2c633850UL, 0x00000001UL, 0x0c72cc78UL, 0x00000000UL, // x^175104 mod p(x)` << 1, x^175168 mod p(x)` << 1
|
||||
0xebcaae4cUL, 0x00000000UL, 0x30cdb032UL, 0x00000000UL, // x^174080 mod p(x)` << 1, x^174144 mod p(x)` << 1
|
||||
0x3ee532a6UL, 0x00000001UL, 0x3e09fc32UL, 0x00000001UL, // x^173056 mod p(x)` << 1, x^173120 mod p(x)` << 1
|
||||
0xbf0cbc7eUL, 0x00000001UL, 0x1ed624d2UL, 0x00000000UL, // x^172032 mod p(x)` << 1, x^172096 mod p(x)` << 1
|
||||
0xd50b7a5aUL, 0x00000000UL, 0x781aee1aUL, 0x00000000UL, // x^171008 mod p(x)` << 1, x^171072 mod p(x)` << 1
|
||||
0x02fca6e8UL, 0x00000000UL, 0xc4d8348cUL, 0x00000001UL, // x^169984 mod p(x)` << 1, x^170048 mod p(x)` << 1
|
||||
0x7af40044UL, 0x00000000UL, 0x57a40336UL, 0x00000000UL, // x^168960 mod p(x)` << 1, x^169024 mod p(x)` << 1
|
||||
0x16178744UL, 0x00000000UL, 0x85544940UL, 0x00000000UL, // x^167936 mod p(x)` << 1, x^168000 mod p(x)` << 1
|
||||
0x4c177458UL, 0x00000001UL, 0x9cd21e80UL, 0x00000001UL, // x^166912 mod p(x)` << 1, x^166976 mod p(x)` << 1
|
||||
0x1b6ddf04UL, 0x00000001UL, 0x3eb95bc0UL, 0x00000001UL, // x^165888 mod p(x)` << 1, x^165952 mod p(x)` << 1
|
||||
0xf3e29cccUL, 0x00000001UL, 0xdfc9fdfcUL, 0x00000001UL, // x^164864 mod p(x)` << 1, x^164928 mod p(x)` << 1
|
||||
0x35ae7562UL, 0x00000001UL, 0xcd028bc2UL, 0x00000000UL, // x^163840 mod p(x)` << 1, x^163904 mod p(x)` << 1
|
||||
0x90ef812cUL, 0x00000001UL, 0x90db8c44UL, 0x00000000UL, // x^162816 mod p(x)` << 1, x^162880 mod p(x)` << 1
|
||||
0x67a2c786UL, 0x00000000UL, 0x0010a4ceUL, 0x00000001UL, // x^161792 mod p(x)` << 1, x^161856 mod p(x)` << 1
|
||||
0x48b9496cUL, 0x00000000UL, 0xc8f4c72cUL, 0x00000001UL, // x^160768 mod p(x)` << 1, x^160832 mod p(x)` << 1
|
||||
0x5a422de6UL, 0x00000001UL, 0x1c26170cUL, 0x00000000UL, // x^159744 mod p(x)` << 1, x^159808 mod p(x)` << 1
|
||||
0xef0e3640UL, 0x00000001UL, 0xe3fccf68UL, 0x00000000UL, // x^158720 mod p(x)` << 1, x^158784 mod p(x)` << 1
|
||||
0x006d2d26UL, 0x00000001UL, 0xd513ed24UL, 0x00000000UL, // x^157696 mod p(x)` << 1, x^157760 mod p(x)` << 1
|
||||
0x170d56d6UL, 0x00000001UL, 0x141beadaUL, 0x00000000UL, // x^156672 mod p(x)` << 1, x^156736 mod p(x)` << 1
|
||||
0xa5fb613cUL, 0x00000000UL, 0x1071aea0UL, 0x00000001UL, // x^155648 mod p(x)` << 1, x^155712 mod p(x)` << 1
|
||||
0x40bbf7fcUL, 0x00000000UL, 0x2e19080aUL, 0x00000001UL, // x^154624 mod p(x)` << 1, x^154688 mod p(x)` << 1
|
||||
0x6ac3a5b2UL, 0x00000001UL, 0x00ecf826UL, 0x00000001UL, // x^153600 mod p(x)` << 1, x^153664 mod p(x)` << 1
|
||||
0xabf16230UL, 0x00000000UL, 0x69b09412UL, 0x00000000UL, // x^152576 mod p(x)` << 1, x^152640 mod p(x)` << 1
|
||||
0xebe23facUL, 0x00000001UL, 0x22297bacUL, 0x00000001UL, // x^151552 mod p(x)` << 1, x^151616 mod p(x)` << 1
|
||||
0x8b6a0894UL, 0x00000000UL, 0xe9e4b068UL, 0x00000000UL, // x^150528 mod p(x)` << 1, x^150592 mod p(x)` << 1
|
||||
0x288ea478UL, 0x00000001UL, 0x4b38651aUL, 0x00000000UL, // x^149504 mod p(x)` << 1, x^149568 mod p(x)` << 1
|
||||
0x6619c442UL, 0x00000001UL, 0x468360e2UL, 0x00000001UL, // x^148480 mod p(x)` << 1, x^148544 mod p(x)` << 1
|
||||
0x86230038UL, 0x00000000UL, 0x121c2408UL, 0x00000000UL, // x^147456 mod p(x)` << 1, x^147520 mod p(x)` << 1
|
||||
0x7746a756UL, 0x00000001UL, 0xda7e7d08UL, 0x00000000UL, // x^146432 mod p(x)` << 1, x^146496 mod p(x)` << 1
|
||||
0x91b8f8f8UL, 0x00000001UL, 0x058d7652UL, 0x00000001UL, // x^145408 mod p(x)` << 1, x^145472 mod p(x)` << 1
|
||||
0x8e167708UL, 0x00000000UL, 0x4a098a90UL, 0x00000001UL, // x^144384 mod p(x)` << 1, x^144448 mod p(x)` << 1
|
||||
0x48b22d54UL, 0x00000001UL, 0x20dbe72eUL, 0x00000000UL, // x^143360 mod p(x)` << 1, x^143424 mod p(x)` << 1
|
||||
0x44ba2c3cUL, 0x00000000UL, 0x1e7323e8UL, 0x00000001UL, // x^142336 mod p(x)` << 1, x^142400 mod p(x)` << 1
|
||||
0xb54d2b52UL, 0x00000000UL, 0xd5d4bf94UL, 0x00000000UL, // x^141312 mod p(x)` << 1, x^141376 mod p(x)` << 1
|
||||
0x05a4fd8aUL, 0x00000000UL, 0x99d8746cUL, 0x00000001UL, // x^140288 mod p(x)` << 1, x^140352 mod p(x)` << 1
|
||||
0x39f9fc46UL, 0x00000001UL, 0xce9ca8a0UL, 0x00000000UL, // x^139264 mod p(x)` << 1, x^139328 mod p(x)` << 1
|
||||
0x5a1fa824UL, 0x00000001UL, 0x136edeceUL, 0x00000000UL, // x^138240 mod p(x)` << 1, x^138304 mod p(x)` << 1
|
||||
0x0a61ae4cUL, 0x00000000UL, 0x9b92a068UL, 0x00000001UL, // x^137216 mod p(x)` << 1, x^137280 mod p(x)` << 1
|
||||
0x45e9113eUL, 0x00000001UL, 0x71d62206UL, 0x00000000UL, // x^136192 mod p(x)` << 1, x^136256 mod p(x)` << 1
|
||||
0x6a348448UL, 0x00000000UL, 0xdfc50158UL, 0x00000000UL, // x^135168 mod p(x)` << 1, x^135232 mod p(x)` << 1
|
||||
0x4d80a08cUL, 0x00000000UL, 0x517626bcUL, 0x00000001UL, // x^134144 mod p(x)` << 1, x^134208 mod p(x)` << 1
|
||||
0x4b6837a0UL, 0x00000001UL, 0x48d1e4faUL, 0x00000001UL, // x^133120 mod p(x)` << 1, x^133184 mod p(x)` << 1
|
||||
0x6896a7fcUL, 0x00000001UL, 0x94d8266eUL, 0x00000000UL, // x^132096 mod p(x)` << 1, x^132160 mod p(x)` << 1
|
||||
0x4f187140UL, 0x00000001UL, 0x606c5e34UL, 0x00000000UL, // x^131072 mod p(x)` << 1, x^131136 mod p(x)` << 1
|
||||
0x9581b9daUL, 0x00000001UL, 0x9766beaaUL, 0x00000001UL, // x^130048 mod p(x)` << 1, x^130112 mod p(x)` << 1
|
||||
0x091bc984UL, 0x00000001UL, 0xd80c506cUL, 0x00000001UL, // x^129024 mod p(x)` << 1, x^129088 mod p(x)` << 1
|
||||
0x1067223cUL, 0x00000000UL, 0x1e73837cUL, 0x00000000UL, // x^128000 mod p(x)` << 1, x^128064 mod p(x)` << 1
|
||||
0xab16ea02UL, 0x00000001UL, 0x64d587deUL, 0x00000000UL, // x^126976 mod p(x)` << 1, x^127040 mod p(x)` << 1
|
||||
0x3c4598a8UL, 0x00000001UL, 0xf4a507b0UL, 0x00000000UL, // x^125952 mod p(x)` << 1, x^126016 mod p(x)` << 1
|
||||
0xb3735430UL, 0x00000000UL, 0x40e342fcUL, 0x00000000UL, // x^124928 mod p(x)` << 1, x^124992 mod p(x)` << 1
|
||||
0xbb3fc0c0UL, 0x00000001UL, 0xd5ad9c3aUL, 0x00000001UL, // x^123904 mod p(x)` << 1, x^123968 mod p(x)` << 1
|
||||
0x570ae19cUL, 0x00000001UL, 0x94a691a4UL, 0x00000000UL, // x^122880 mod p(x)` << 1, x^122944 mod p(x)` << 1
|
||||
0xea910712UL, 0x00000001UL, 0x271ecdfaUL, 0x00000001UL, // x^121856 mod p(x)` << 1, x^121920 mod p(x)` << 1
|
||||
0x67127128UL, 0x00000001UL, 0x9e54475aUL, 0x00000000UL, // x^120832 mod p(x)` << 1, x^120896 mod p(x)` << 1
|
||||
0x19e790a2UL, 0x00000000UL, 0xc9c099eeUL, 0x00000000UL, // x^119808 mod p(x)` << 1, x^119872 mod p(x)` << 1
|
||||
0x3788f710UL, 0x00000000UL, 0x9a2f736cUL, 0x00000000UL, // x^118784 mod p(x)` << 1, x^118848 mod p(x)` << 1
|
||||
0x682a160eUL, 0x00000001UL, 0xbb9f4996UL, 0x00000000UL, // x^117760 mod p(x)` << 1, x^117824 mod p(x)` << 1
|
||||
0x7f0ebd2eUL, 0x00000000UL, 0xdb688050UL, 0x00000001UL, // x^116736 mod p(x)` << 1, x^116800 mod p(x)` << 1
|
||||
0x2b032080UL, 0x00000000UL, 0xe9b10af4UL, 0x00000000UL, // x^115712 mod p(x)` << 1, x^115776 mod p(x)` << 1
|
||||
0xcfd1664aUL, 0x00000000UL, 0x2d4545e4UL, 0x00000001UL, // x^114688 mod p(x)` << 1, x^114752 mod p(x)` << 1
|
||||
0xaa1181c2UL, 0x00000000UL, 0x0361139cUL, 0x00000000UL, // x^113664 mod p(x)` << 1, x^113728 mod p(x)` << 1
|
||||
0xddd08002UL, 0x00000000UL, 0xa5a1a3a8UL, 0x00000001UL, // x^112640 mod p(x)` << 1, x^112704 mod p(x)` << 1
|
||||
0xe8dd0446UL, 0x00000000UL, 0x6844e0b0UL, 0x00000000UL, // x^111616 mod p(x)` << 1, x^111680 mod p(x)` << 1
|
||||
0xbbd94a00UL, 0x00000001UL, 0xc3762f28UL, 0x00000000UL, // x^110592 mod p(x)` << 1, x^110656 mod p(x)` << 1
|
||||
0xab6cd180UL, 0x00000000UL, 0xd26287a2UL, 0x00000001UL, // x^109568 mod p(x)` << 1, x^109632 mod p(x)` << 1
|
||||
0x31803ce2UL, 0x00000000UL, 0xf6f0bba8UL, 0x00000001UL, // x^108544 mod p(x)` << 1, x^108608 mod p(x)` << 1
|
||||
0x24f40b0cUL, 0x00000000UL, 0x2ffabd62UL, 0x00000000UL, // x^107520 mod p(x)` << 1, x^107584 mod p(x)` << 1
|
||||
0xba1d9834UL, 0x00000001UL, 0xfb4516b8UL, 0x00000000UL, // x^106496 mod p(x)` << 1, x^106560 mod p(x)` << 1
|
||||
0x04de61aaUL, 0x00000001UL, 0x8cfa961cUL, 0x00000001UL, // x^105472 mod p(x)` << 1, x^105536 mod p(x)` << 1
|
||||
0x13e40d46UL, 0x00000001UL, 0x9e588d52UL, 0x00000001UL, // x^104448 mod p(x)` << 1, x^104512 mod p(x)` << 1
|
||||
0x415598a0UL, 0x00000001UL, 0x180f0bbcUL, 0x00000001UL, // x^103424 mod p(x)` << 1, x^103488 mod p(x)` << 1
|
||||
0xbf6c8c90UL, 0x00000000UL, 0xe1d9177aUL, 0x00000000UL, // x^102400 mod p(x)` << 1, x^102464 mod p(x)` << 1
|
||||
0x788b0504UL, 0x00000001UL, 0x05abc27cUL, 0x00000001UL, // x^101376 mod p(x)` << 1, x^101440 mod p(x)` << 1
|
||||
0x38385d02UL, 0x00000000UL, 0x972e4a58UL, 0x00000000UL, // x^100352 mod p(x)` << 1, x^100416 mod p(x)` << 1
|
||||
0xb6c83844UL, 0x00000001UL, 0x83499a5eUL, 0x00000001UL, // x^99328 mod p(x)` << 1, x^99392 mod p(x)` << 1
|
||||
0x51061a8aUL, 0x00000000UL, 0xc96a8ccaUL, 0x00000001UL, // x^98304 mod p(x)` << 1, x^98368 mod p(x)` << 1
|
||||
0x7351388aUL, 0x00000001UL, 0xa1a5b60cUL, 0x00000001UL, // x^97280 mod p(x)` << 1, x^97344 mod p(x)` << 1
|
||||
0x32928f92UL, 0x00000001UL, 0xe4b6ac9cUL, 0x00000000UL, // x^96256 mod p(x)` << 1, x^96320 mod p(x)` << 1
|
||||
0xe6b4f48aUL, 0x00000000UL, 0x807e7f5aUL, 0x00000001UL, // x^95232 mod p(x)` << 1, x^95296 mod p(x)` << 1
|
||||
0x39d15e90UL, 0x00000000UL, 0x7a7e3bc8UL, 0x00000001UL, // x^94208 mod p(x)` << 1, x^94272 mod p(x)` << 1
|
||||
0x312d6074UL, 0x00000000UL, 0xd73975daUL, 0x00000000UL, // x^93184 mod p(x)` << 1, x^93248 mod p(x)` << 1
|
||||
0x7bbb2cc4UL, 0x00000001UL, 0x7375d038UL, 0x00000001UL, // x^92160 mod p(x)` << 1, x^92224 mod p(x)` << 1
|
||||
0x6ded3e18UL, 0x00000001UL, 0x193680bcUL, 0x00000000UL, // x^91136 mod p(x)` << 1, x^91200 mod p(x)` << 1
|
||||
0xf1638b16UL, 0x00000000UL, 0x999b06f6UL, 0x00000000UL, // x^90112 mod p(x)` << 1, x^90176 mod p(x)` << 1
|
||||
0xd38b9eccUL, 0x00000001UL, 0xf685d2b8UL, 0x00000001UL, // x^89088 mod p(x)` << 1, x^89152 mod p(x)` << 1
|
||||
0x8b8d09dcUL, 0x00000001UL, 0xf4ecbed2UL, 0x00000001UL, // x^88064 mod p(x)` << 1, x^88128 mod p(x)` << 1
|
||||
0xe7bc27d2UL, 0x00000000UL, 0xba16f1a0UL, 0x00000000UL, // x^87040 mod p(x)` << 1, x^87104 mod p(x)` << 1
|
||||
0x275e1e96UL, 0x00000000UL, 0x15aceac4UL, 0x00000001UL, // x^86016 mod p(x)` << 1, x^86080 mod p(x)` << 1
|
||||
0xe2e3031eUL, 0x00000000UL, 0xaeff6292UL, 0x00000001UL, // x^84992 mod p(x)` << 1, x^85056 mod p(x)` << 1
|
||||
0x041c84d8UL, 0x00000001UL, 0x9640124cUL, 0x00000000UL, // x^83968 mod p(x)` << 1, x^84032 mod p(x)` << 1
|
||||
0x706ce672UL, 0x00000000UL, 0x14f41f02UL, 0x00000001UL, // x^82944 mod p(x)` << 1, x^83008 mod p(x)` << 1
|
||||
0x5d5070daUL, 0x00000001UL, 0x9c5f3586UL, 0x00000000UL, // x^81920 mod p(x)` << 1, x^81984 mod p(x)` << 1
|
||||
0x38f9493aUL, 0x00000000UL, 0x878275faUL, 0x00000001UL, // x^80896 mod p(x)` << 1, x^80960 mod p(x)` << 1
|
||||
0xa3348a76UL, 0x00000000UL, 0xddc42ce8UL, 0x00000000UL, // x^79872 mod p(x)` << 1, x^79936 mod p(x)` << 1
|
||||
0xad0aab92UL, 0x00000001UL, 0x81d2c73aUL, 0x00000001UL, // x^78848 mod p(x)` << 1, x^78912 mod p(x)` << 1
|
||||
0x9e85f712UL, 0x00000001UL, 0x41c9320aUL, 0x00000001UL, // x^77824 mod p(x)` << 1, x^77888 mod p(x)` << 1
|
||||
0x5a871e76UL, 0x00000000UL, 0x5235719aUL, 0x00000001UL, // x^76800 mod p(x)` << 1, x^76864 mod p(x)` << 1
|
||||
0x7249c662UL, 0x00000001UL, 0xbe27d804UL, 0x00000000UL, // x^75776 mod p(x)` << 1, x^75840 mod p(x)` << 1
|
||||
0x3a084712UL, 0x00000000UL, 0x6242d45aUL, 0x00000000UL, // x^74752 mod p(x)` << 1, x^74816 mod p(x)` << 1
|
||||
0xed438478UL, 0x00000000UL, 0x9a53638eUL, 0x00000000UL, // x^73728 mod p(x)` << 1, x^73792 mod p(x)` << 1
|
||||
0xabac34ccUL, 0x00000000UL, 0x001ecfb6UL, 0x00000001UL, // x^72704 mod p(x)` << 1, x^72768 mod p(x)` << 1
|
||||
0x5f35ef3eUL, 0x00000000UL, 0x6d7c2d64UL, 0x00000001UL, // x^71680 mod p(x)` << 1, x^71744 mod p(x)` << 1
|
||||
0x47d6608cUL, 0x00000000UL, 0xd0ce46c0UL, 0x00000001UL, // x^70656 mod p(x)` << 1, x^70720 mod p(x)` << 1
|
||||
0x2d01470eUL, 0x00000000UL, 0x24c907b4UL, 0x00000001UL, // x^69632 mod p(x)` << 1, x^69696 mod p(x)` << 1
|
||||
0x58bbc7b0UL, 0x00000001UL, 0x18a555caUL, 0x00000000UL, // x^68608 mod p(x)` << 1, x^68672 mod p(x)` << 1
|
||||
0xc0a23e8eUL, 0x00000000UL, 0x6b0980bcUL, 0x00000000UL, // x^67584 mod p(x)` << 1, x^67648 mod p(x)` << 1
|
||||
0xebd85c88UL, 0x00000001UL, 0x8bbba964UL, 0x00000000UL, // x^66560 mod p(x)` << 1, x^66624 mod p(x)` << 1
|
||||
0x9ee20bb2UL, 0x00000001UL, 0x070a5a1eUL, 0x00000001UL, // x^65536 mod p(x)` << 1, x^65600 mod p(x)` << 1
|
||||
0xacabf2d6UL, 0x00000001UL, 0x2204322aUL, 0x00000000UL, // x^64512 mod p(x)` << 1, x^64576 mod p(x)` << 1
|
||||
0xb7963d56UL, 0x00000001UL, 0xa27524d0UL, 0x00000000UL, // x^63488 mod p(x)` << 1, x^63552 mod p(x)` << 1
|
||||
0x7bffa1feUL, 0x00000001UL, 0x20b1e4baUL, 0x00000000UL, // x^62464 mod p(x)` << 1, x^62528 mod p(x)` << 1
|
||||
0x1f15333eUL, 0x00000000UL, 0x32cc27fcUL, 0x00000000UL, // x^61440 mod p(x)` << 1, x^61504 mod p(x)` << 1
|
||||
0x8593129eUL, 0x00000001UL, 0x44dd22b8UL, 0x00000000UL, // x^60416 mod p(x)` << 1, x^60480 mod p(x)` << 1
|
||||
0x9cb32602UL, 0x00000001UL, 0xdffc9e0aUL, 0x00000000UL, // x^59392 mod p(x)` << 1, x^59456 mod p(x)` << 1
|
||||
0x42b05cc8UL, 0x00000001UL, 0xb7a0ed14UL, 0x00000001UL, // x^58368 mod p(x)` << 1, x^58432 mod p(x)` << 1
|
||||
0xbe49e7a4UL, 0x00000001UL, 0xc7842488UL, 0x00000000UL, // x^57344 mod p(x)` << 1, x^57408 mod p(x)` << 1
|
||||
0x08f69d6cUL, 0x00000001UL, 0xc02a4feeUL, 0x00000001UL, // x^56320 mod p(x)` << 1, x^56384 mod p(x)` << 1
|
||||
0x6c0971f0UL, 0x00000000UL, 0x3c273778UL, 0x00000000UL, // x^55296 mod p(x)` << 1, x^55360 mod p(x)` << 1
|
||||
0x5b16467aUL, 0x00000000UL, 0xd63f8894UL, 0x00000001UL, // x^54272 mod p(x)` << 1, x^54336 mod p(x)` << 1
|
||||
0x551a628eUL, 0x00000001UL, 0x6be557d6UL, 0x00000000UL, // x^53248 mod p(x)` << 1, x^53312 mod p(x)` << 1
|
||||
0x9e42ea92UL, 0x00000001UL, 0x6a7806eaUL, 0x00000000UL, // x^52224 mod p(x)` << 1, x^52288 mod p(x)` << 1
|
||||
0x2fa83ff2UL, 0x00000001UL, 0x6155aa0cUL, 0x00000001UL, // x^51200 mod p(x)` << 1, x^51264 mod p(x)` << 1
|
||||
0x1ca9cde0UL, 0x00000001UL, 0x908650acUL, 0x00000000UL, // x^50176 mod p(x)` << 1, x^50240 mod p(x)` << 1
|
||||
0xc8e5cd74UL, 0x00000000UL, 0xaa5a8084UL, 0x00000000UL, // x^49152 mod p(x)` << 1, x^49216 mod p(x)` << 1
|
||||
0x96c27f0cUL, 0x00000000UL, 0x91bb500aUL, 0x00000001UL, // x^48128 mod p(x)` << 1, x^48192 mod p(x)` << 1
|
||||
0x2baed926UL, 0x00000000UL, 0x64e9bed0UL, 0x00000000UL, // x^47104 mod p(x)` << 1, x^47168 mod p(x)` << 1
|
||||
0x7c8de8d2UL, 0x00000001UL, 0x9444f302UL, 0x00000000UL, // x^46080 mod p(x)` << 1, x^46144 mod p(x)` << 1
|
||||
0xd43d6068UL, 0x00000000UL, 0x9db07d3cUL, 0x00000001UL, // x^45056 mod p(x)` << 1, x^45120 mod p(x)` << 1
|
||||
0xcb2c4b26UL, 0x00000000UL, 0x359e3e6eUL, 0x00000001UL, // x^44032 mod p(x)` << 1, x^44096 mod p(x)` << 1
|
||||
0x45b8da26UL, 0x00000001UL, 0xe4f10dd2UL, 0x00000001UL, // x^43008 mod p(x)` << 1, x^43072 mod p(x)` << 1
|
||||
0x8fff4b08UL, 0x00000001UL, 0x24f5735eUL, 0x00000001UL, // x^41984 mod p(x)` << 1, x^42048 mod p(x)` << 1
|
||||
0x50b58ed0UL, 0x00000001UL, 0x24760a4cUL, 0x00000001UL, // x^40960 mod p(x)` << 1, x^41024 mod p(x)` << 1
|
||||
0x549f39bcUL, 0x00000001UL, 0x0f1fc186UL, 0x00000000UL, // x^39936 mod p(x)` << 1, x^40000 mod p(x)` << 1
|
||||
0xef4d2f42UL, 0x00000000UL, 0x150e4cc4UL, 0x00000000UL, // x^38912 mod p(x)` << 1, x^38976 mod p(x)` << 1
|
||||
0xb1468572UL, 0x00000001UL, 0x2a6204e8UL, 0x00000000UL, // x^37888 mod p(x)` << 1, x^37952 mod p(x)` << 1
|
||||
0x3d7403b2UL, 0x00000001UL, 0xbeb1d432UL, 0x00000000UL, // x^36864 mod p(x)` << 1, x^36928 mod p(x)` << 1
|
||||
0xa4681842UL, 0x00000001UL, 0x35f3f1f0UL, 0x00000001UL, // x^35840 mod p(x)` << 1, x^35904 mod p(x)` << 1
|
||||
0x67714492UL, 0x00000001UL, 0x74fe2232UL, 0x00000000UL, // x^34816 mod p(x)` << 1, x^34880 mod p(x)` << 1
|
||||
0xe599099aUL, 0x00000001UL, 0x1ac6e2baUL, 0x00000000UL, // x^33792 mod p(x)` << 1, x^33856 mod p(x)` << 1
|
||||
0xfe128194UL, 0x00000000UL, 0x13fca91eUL, 0x00000000UL, // x^32768 mod p(x)` << 1, x^32832 mod p(x)` << 1
|
||||
0x77e8b990UL, 0x00000000UL, 0x83f4931eUL, 0x00000001UL, // x^31744 mod p(x)` << 1, x^31808 mod p(x)` << 1
|
||||
0xa267f63aUL, 0x00000001UL, 0xb6d9b4e4UL, 0x00000000UL, // x^30720 mod p(x)` << 1, x^30784 mod p(x)` << 1
|
||||
0x945c245aUL, 0x00000001UL, 0xb5188656UL, 0x00000000UL, // x^29696 mod p(x)` << 1, x^29760 mod p(x)` << 1
|
||||
0x49002e76UL, 0x00000001UL, 0x27a81a84UL, 0x00000000UL, // x^28672 mod p(x)` << 1, x^28736 mod p(x)` << 1
|
||||
0xbb8310a4UL, 0x00000001UL, 0x25699258UL, 0x00000001UL, // x^27648 mod p(x)` << 1, x^27712 mod p(x)` << 1
|
||||
0x9ec60bccUL, 0x00000001UL, 0xb23de796UL, 0x00000001UL, // x^26624 mod p(x)` << 1, x^26688 mod p(x)` << 1
|
||||
0x2d8590aeUL, 0x00000001UL, 0xfe4365dcUL, 0x00000000UL, // x^25600 mod p(x)` << 1, x^25664 mod p(x)` << 1
|
||||
0x65b00684UL, 0x00000000UL, 0xc68f497aUL, 0x00000000UL, // x^24576 mod p(x)` << 1, x^24640 mod p(x)` << 1
|
||||
0x5e5aeadcUL, 0x00000001UL, 0xfbf521eeUL, 0x00000000UL, // x^23552 mod p(x)` << 1, x^23616 mod p(x)` << 1
|
||||
0xb77ff2b0UL, 0x00000000UL, 0x5eac3378UL, 0x00000001UL, // x^22528 mod p(x)` << 1, x^22592 mod p(x)` << 1
|
||||
0x88da2ff6UL, 0x00000001UL, 0x34914b90UL, 0x00000001UL, // x^21504 mod p(x)` << 1, x^21568 mod p(x)` << 1
|
||||
0x63da929aUL, 0x00000000UL, 0x16335cfeUL, 0x00000000UL, // x^20480 mod p(x)` << 1, x^20544 mod p(x)` << 1
|
||||
0x389caa80UL, 0x00000001UL, 0x0372d10cUL, 0x00000001UL, // x^19456 mod p(x)` << 1, x^19520 mod p(x)` << 1
|
||||
0x3db599d2UL, 0x00000001UL, 0x5097b908UL, 0x00000001UL, // x^18432 mod p(x)` << 1, x^18496 mod p(x)` << 1
|
||||
0x22505a86UL, 0x00000001UL, 0x227a7572UL, 0x00000001UL, // x^17408 mod p(x)` << 1, x^17472 mod p(x)` << 1
|
||||
0x6bd72746UL, 0x00000001UL, 0x9a8f75c0UL, 0x00000000UL, // x^16384 mod p(x)` << 1, x^16448 mod p(x)` << 1
|
||||
0xc3faf1d4UL, 0x00000001UL, 0x682c77a2UL, 0x00000000UL, // x^15360 mod p(x)` << 1, x^15424 mod p(x)` << 1
|
||||
0x111c826cUL, 0x00000001UL, 0x231f091cUL, 0x00000000UL, // x^14336 mod p(x)` << 1, x^14400 mod p(x)` << 1
|
||||
0x153e9fb2UL, 0x00000000UL, 0x7d4439f2UL, 0x00000000UL, // x^13312 mod p(x)` << 1, x^13376 mod p(x)` << 1
|
||||
0x2b1f7b60UL, 0x00000000UL, 0x7e221efcUL, 0x00000001UL, // x^12288 mod p(x)` << 1, x^12352 mod p(x)` << 1
|
||||
0xb1dba570UL, 0x00000000UL, 0x67457c38UL, 0x00000001UL, // x^11264 mod p(x)` << 1, x^11328 mod p(x)` << 1
|
||||
0xf6397b76UL, 0x00000001UL, 0xbdf081c4UL, 0x00000000UL, // x^10240 mod p(x)` << 1, x^10304 mod p(x)` << 1
|
||||
0x56335214UL, 0x00000001UL, 0x6286d6b0UL, 0x00000001UL, // x^9216 mod p(x)` << 1, x^9280 mod p(x)` << 1
|
||||
0xd70e3986UL, 0x00000001UL, 0xc84f001cUL, 0x00000000UL, // x^8192 mod p(x)` << 1, x^8256 mod p(x)` << 1
|
||||
0x3701a774UL, 0x00000000UL, 0x64efe7c0UL, 0x00000000UL, // x^7168 mod p(x)` << 1, x^7232 mod p(x)` << 1
|
||||
0xac81ef72UL, 0x00000000UL, 0x0ac2d904UL, 0x00000000UL, // x^6144 mod p(x)` << 1, x^6208 mod p(x)` << 1
|
||||
0x33212464UL, 0x00000001UL, 0xfd226d14UL, 0x00000000UL, // x^5120 mod p(x)` << 1, x^5184 mod p(x)` << 1
|
||||
0xe4e45610UL, 0x00000000UL, 0x1cfd42e0UL, 0x00000001UL, // x^4096 mod p(x)` << 1, x^4160 mod p(x)` << 1
|
||||
0x0c1bd370UL, 0x00000000UL, 0x6e5a5678UL, 0x00000001UL, // x^3072 mod p(x)` << 1, x^3136 mod p(x)` << 1
|
||||
0xa7b9e7a6UL, 0x00000001UL, 0xd888fe22UL, 0x00000001UL, // x^2048 mod p(x)` << 1, x^2112 mod p(x)` << 1
|
||||
0x7d657a10UL, 0x00000000UL, 0xaf77fcd4UL, 0x00000001UL, // x^1024 mod p(x)` << 1, x^1088 mod p(x)` << 1
|
||||
|
||||
// Reduce final 1024-2048 bits to 64 bits, shifting 32 bits to include the trailing 32 bits of zeros
|
||||
0xec447f11UL, 0x99168a18UL, 0x13e8221eUL, 0xed837b26UL, // x^2048 mod p(x)`, x^2016 mod p(x)`, x^1984 mod p(x)`, x^1952 mod p(x)`
|
||||
0x8fd2cd3cUL, 0xe23e954eUL, 0x47b9ce5aUL, 0xc8acdd81UL, // x^1920 mod p(x)`, x^1888 mod p(x)`, x^1856 mod p(x)`, x^1824 mod p(x)`
|
||||
0x6b1d2b53UL, 0x92f8befeUL, 0xd4277e25UL, 0xd9ad6d87UL, // x^1792 mod p(x)`, x^1760 mod p(x)`, x^1728 mod p(x)`, x^1696 mod p(x)`
|
||||
0x291ea462UL, 0xf38a3556UL, 0x33fbca3bUL, 0xc10ec5e0UL, // x^1664 mod p(x)`, x^1632 mod p(x)`, x^1600 mod p(x)`, x^1568 mod p(x)`
|
||||
0x62b6ca4bUL, 0x974ac562UL, 0x82e02e2fUL, 0xc0b55b0eUL, // x^1536 mod p(x)`, x^1504 mod p(x)`, x^1472 mod p(x)`, x^1440 mod p(x)`
|
||||
0x784d2a56UL, 0x855712b3UL, 0xe172334dUL, 0x71aa1df0UL, // x^1408 mod p(x)`, x^1376 mod p(x)`, x^1344 mod p(x)`, x^1312 mod p(x)`
|
||||
0x0eaee722UL, 0xa5abe9f8UL, 0x3969324dUL, 0xfee3053eUL, // x^1280 mod p(x)`, x^1248 mod p(x)`, x^1216 mod p(x)`, x^1184 mod p(x)`
|
||||
0xdb54814cUL, 0x1fa0943dUL, 0x3eb2bd08UL, 0xf44779b9UL, // x^1152 mod p(x)`, x^1120 mod p(x)`, x^1088 mod p(x)`, x^1056 mod p(x)`
|
||||
0xd7bbfe6aUL, 0xa53ff440UL, 0x00cc3374UL, 0xf5449b3fUL, // x^1024 mod p(x)`, x^992 mod p(x)`, x^960 mod p(x)`, x^928 mod p(x)`
|
||||
0x6325605cUL, 0xebe7e356UL, 0xd777606eUL, 0x6f8346e1UL, // x^896 mod p(x)`, x^864 mod p(x)`, x^832 mod p(x)`, x^800 mod p(x)`
|
||||
0xe5b592b8UL, 0xc65a272cUL, 0xc0b95347UL, 0xe3ab4f2aUL, // x^768 mod p(x)`, x^736 mod p(x)`, x^704 mod p(x)`, x^672 mod p(x)`
|
||||
0x4721589fUL, 0x5705a9caUL, 0x329ecc11UL, 0xaa2215eaUL, // x^640 mod p(x)`, x^608 mod p(x)`, x^576 mod p(x)`, x^544 mod p(x)`
|
||||
0x88d14467UL, 0xe3720acbUL, 0xd95efd26UL, 0x1ed8f66eUL, // x^512 mod p(x)`, x^480 mod p(x)`, x^448 mod p(x)`, x^416 mod p(x)`
|
||||
0x15141c31UL, 0xba1aca03UL, 0xa700e96aUL, 0x78ed02d5UL, // x^384 mod p(x)`, x^352 mod p(x)`, x^320 mod p(x)`, x^288 mod p(x)`
|
||||
0xed627daeUL, 0xad2a31b3UL, 0x32b39da3UL, 0xba8ccbe8UL, // x^256 mod p(x)`, x^224 mod p(x)`, x^192 mod p(x)`, x^160 mod p(x)`
|
||||
0xa06a2517UL, 0x6655004fUL, 0xb1e6b092UL, 0xedb88320UL // x^128 mod p(x)`, x^96 mod p(x)`, x^64 mod p(x)`, x^32 mod p(x)`
|
||||
};
|
||||
|
||||
juint* ptr = (juint*) malloc(sizeof(juint) * CRC32_CONSTANTS_SIZE);
|
||||
guarantee(((intptr_t)ptr & 0xF) == 0, "16-byte alignment needed");
|
||||
guarantee(ptr != NULL, "allocation error of a crc table");
|
||||
memcpy((void*)ptr, constants, sizeof(juint) * CRC32_CONSTANTS_SIZE);
|
||||
return ptr;
|
||||
}
|
||||
|
||||
juint* StubRoutines::ppc64::generate_crc_barret_constants() {
|
||||
juint barret_constants[CRC32_BARRET_CONSTANTS] = {
|
||||
0xf7011641UL, 0x00000001UL, 0x00000000UL, 0x00000000UL,
|
||||
0xdb710641UL, 0x00000001UL, 0x00000000UL, 0x00000000UL
|
||||
};
|
||||
juint* ptr = (juint*) malloc(sizeof(juint) * CRC32_CONSTANTS_SIZE);
|
||||
guarantee(((intptr_t)ptr & 0xF) == 0, "16-byte alignment needed");
|
||||
guarantee(ptr != NULL, "allocation error of a crc table");
|
||||
memcpy((void*) ptr, barret_constants, sizeof(juint) * CRC32_BARRET_CONSTANTS);
|
||||
return ptr;
|
||||
}
|
||||
|
||||
// CRC32 Intrinsics.
|
||||
/**
|
||||
* crc_table[] from jdk/src/share/native/java/util/zip/zlib-1.2.8/crc32.h
|
||||
@ -477,3 +782,7 @@ juint StubRoutines::ppc64::_crc_table[CRC32_TABLES][CRC32_COLUMN_SIZE] = {
|
||||
#endif
|
||||
}
|
||||
};
|
||||
|
||||
juint* StubRoutines::ppc64::_constants = StubRoutines::ppc64::generate_crc_constants();
|
||||
|
||||
juint* StubRoutines::ppc64::_barret_constants = StubRoutines::ppc64::generate_crc_barret_constants();
|
||||
|
@ -1544,6 +1544,12 @@ address TemplateInterpreterGenerator::generate_native_entry(bool synchronized) {
|
||||
__ fence();
|
||||
}
|
||||
|
||||
if (CheckJNICalls) {
|
||||
// clear_pending_jni_exception_check
|
||||
__ load_const_optimized(R0, 0L);
|
||||
__ st_ptr(R0, JavaThread::pending_jni_exception_check_fn_offset(), R16_thread);
|
||||
}
|
||||
|
||||
__ reset_last_Java_frame();
|
||||
|
||||
// Jvmdi/jvmpi support. Whether we've got an exception pending or
|
||||
|
@ -230,6 +230,11 @@ void VM_Version::initialize() {
|
||||
FLAG_SET_DEFAULT(UseGHASHIntrinsics, false);
|
||||
}
|
||||
|
||||
if (UseFMA) {
|
||||
warning("FMA instructions are not available on this CPU");
|
||||
FLAG_SET_DEFAULT(UseFMA, false);
|
||||
}
|
||||
|
||||
if (UseSHA) {
|
||||
warning("SHA instructions are not available on this CPU");
|
||||
FLAG_SET_DEFAULT(UseSHA, false);
|
||||
@ -274,7 +279,14 @@ void VM_Version::initialize() {
|
||||
}
|
||||
bool os_too_old = true;
|
||||
#ifdef AIX
|
||||
if (os::Aix::os_version() >= 0x0701031e) { // at least AIX 7.1.3.30
|
||||
// Actually, this is supported since AIX 7.1.. Unfortunately, this first
|
||||
// contained bugs, so that it can only be enabled after AIX 7.1.3.30.
|
||||
// The Java property os.version, which is used in RTM tests to decide
|
||||
// whether the feature is available, only knows major and minor versions.
|
||||
// We don't want to change this property, as user code might depend on it.
|
||||
// So the tests can not check on subversion 3.30, and we only enable RTM
|
||||
// with AIX 7.2.
|
||||
if (os::Aix::os_version() >= 0x07020000) { // At least AIX 7.2.
|
||||
os_too_old = false;
|
||||
}
|
||||
#endif
|
||||
|
@ -147,10 +147,11 @@ LIR_Opr LIRGenerator::safepoint_poll_register() {
|
||||
LIR_Address* LIRGenerator::generate_address(LIR_Opr base, LIR_Opr index,
|
||||
int shift, int disp, BasicType type) {
|
||||
assert(base->is_register(), "must be");
|
||||
intx large_disp = disp;
|
||||
|
||||
// accumulate fixed displacements
|
||||
if (index->is_constant()) {
|
||||
disp += index->as_constant_ptr()->as_jint() << shift;
|
||||
large_disp += (intx)(index->as_constant_ptr()->as_jint()) << shift;
|
||||
index = LIR_OprFact::illegalOpr;
|
||||
}
|
||||
|
||||
@ -161,31 +162,31 @@ LIR_Address* LIRGenerator::generate_address(LIR_Opr base, LIR_Opr index,
|
||||
__ shift_left(index, shift, tmp);
|
||||
index = tmp;
|
||||
}
|
||||
if (disp != 0) {
|
||||
if (large_disp != 0) {
|
||||
LIR_Opr tmp = new_pointer_register();
|
||||
if (Assembler::is_simm13(disp)) {
|
||||
__ add(tmp, LIR_OprFact::intptrConst(disp), tmp);
|
||||
if (Assembler::is_simm13(large_disp)) {
|
||||
__ add(tmp, LIR_OprFact::intptrConst(large_disp), tmp);
|
||||
index = tmp;
|
||||
} else {
|
||||
__ move(LIR_OprFact::intptrConst(disp), tmp);
|
||||
__ move(LIR_OprFact::intptrConst(large_disp), tmp);
|
||||
__ add(tmp, index, tmp);
|
||||
index = tmp;
|
||||
}
|
||||
disp = 0;
|
||||
large_disp = 0;
|
||||
}
|
||||
} else if (disp != 0 && !Assembler::is_simm13(disp)) {
|
||||
} else if (large_disp != 0 && !Assembler::is_simm13(large_disp)) {
|
||||
// index is illegal so replace it with the displacement loaded into a register
|
||||
index = new_pointer_register();
|
||||
__ move(LIR_OprFact::intptrConst(disp), index);
|
||||
disp = 0;
|
||||
__ move(LIR_OprFact::intptrConst(large_disp), index);
|
||||
large_disp = 0;
|
||||
}
|
||||
|
||||
// at this point we either have base + index or base + displacement
|
||||
if (disp == 0) {
|
||||
if (large_disp == 0) {
|
||||
return new LIR_Address(base, index, type);
|
||||
} else {
|
||||
assert(Assembler::is_simm13(disp), "must be");
|
||||
return new LIR_Address(base, disp, type);
|
||||
assert(Assembler::is_simm13(large_disp), "must be");
|
||||
return new LIR_Address(base, large_disp, type);
|
||||
}
|
||||
}
|
||||
|
||||
@ -196,11 +197,11 @@ LIR_Address* LIRGenerator::emit_array_address(LIR_Opr array_opr, LIR_Opr index_o
|
||||
int shift = exact_log2(elem_size);
|
||||
|
||||
LIR_Opr base_opr;
|
||||
int offset = arrayOopDesc::base_offset_in_bytes(type);
|
||||
intx offset = arrayOopDesc::base_offset_in_bytes(type);
|
||||
|
||||
if (index_opr->is_constant()) {
|
||||
int i = index_opr->as_constant_ptr()->as_jint();
|
||||
int array_offset = i * elem_size;
|
||||
intx i = index_opr->as_constant_ptr()->as_jint();
|
||||
intx array_offset = i * elem_size;
|
||||
if (Assembler::is_simm13(array_offset + offset)) {
|
||||
base_opr = array_opr;
|
||||
offset = array_offset + offset;
|
||||
@ -953,6 +954,10 @@ void LIRGenerator::do_update_CRC32C(Intrinsic* x) {
|
||||
}
|
||||
}
|
||||
|
||||
void LIRGenerator::do_FmaIntrinsic(Intrinsic* x) {
|
||||
fatal("FMA intrinsic is not implemented on this platform");
|
||||
}
|
||||
|
||||
void LIRGenerator::do_vectorizedMismatch(Intrinsic* x) {
|
||||
fatal("vectorizedMismatch intrinsic is not implemented on this platform");
|
||||
}
|
||||
|
@ -881,20 +881,15 @@ OopMapSet* Runtime1::generate_code_for(StubID id, StubAssembler* sasm) {
|
||||
__ delayed()->st_ptr(tmp, G2_thread, satb_q_index_byte_offset);
|
||||
|
||||
__ bind(refill);
|
||||
__ save_frame(0);
|
||||
|
||||
__ mov(pre_val, L0);
|
||||
__ mov(tmp, L1);
|
||||
__ mov(tmp2, L2);
|
||||
save_live_registers(sasm);
|
||||
|
||||
__ call_VM_leaf(L7_thread_cache,
|
||||
CAST_FROM_FN_PTR(address,
|
||||
SATBMarkQueueSet::handle_zero_index_for_thread),
|
||||
G2_thread);
|
||||
|
||||
__ mov(L0, pre_val);
|
||||
__ mov(L1, tmp);
|
||||
__ mov(L2, tmp2);
|
||||
restore_live_registers(sasm);
|
||||
|
||||
__ br(Assembler::always, /*annul*/false, Assembler::pt, restart);
|
||||
__ delayed()->restore();
|
||||
@ -986,20 +981,15 @@ OopMapSet* Runtime1::generate_code_for(StubID id, StubAssembler* sasm) {
|
||||
__ delayed()->st_ptr(tmp3, G2_thread, dirty_card_q_index_byte_offset);
|
||||
|
||||
__ bind(refill);
|
||||
__ save_frame(0);
|
||||
|
||||
__ mov(tmp2, L0);
|
||||
__ mov(tmp3, L1);
|
||||
__ mov(tmp4, L2);
|
||||
save_live_registers(sasm);
|
||||
|
||||
__ call_VM_leaf(L7_thread_cache,
|
||||
CAST_FROM_FN_PTR(address,
|
||||
DirtyCardQueueSet::handle_zero_index_for_thread),
|
||||
G2_thread);
|
||||
|
||||
__ mov(L0, tmp2);
|
||||
__ mov(L1, tmp3);
|
||||
__ mov(L2, tmp4);
|
||||
restore_live_registers(sasm);
|
||||
|
||||
__ br(Assembler::always, /*annul*/false, Assembler::pt, restart);
|
||||
__ delayed()->restore();
|
||||
|
@ -266,6 +266,11 @@ void VM_Version::initialize() {
|
||||
FLAG_SET_DEFAULT(UseGHASHIntrinsics, false);
|
||||
}
|
||||
|
||||
if (UseFMA) {
|
||||
warning("FMA instructions are not available on this CPU");
|
||||
FLAG_SET_DEFAULT(UseFMA, false);
|
||||
}
|
||||
|
||||
// SHA1, SHA256, and SHA512 instructions were added to SPARC T-series at different times
|
||||
if (has_sha1() || has_sha256() || has_sha512()) {
|
||||
if (UseVIS > 0) { // SHA intrinsics use VIS1 instructions
|
||||
|
@ -172,7 +172,9 @@ bool AbstractInterpreter::can_be_compiled(methodHandle m) {
|
||||
case Interpreter::java_lang_math_log10 : // fall thru
|
||||
case Interpreter::java_lang_math_sqrt : // fall thru
|
||||
case Interpreter::java_lang_math_pow : // fall thru
|
||||
case Interpreter::java_lang_math_exp :
|
||||
case Interpreter::java_lang_math_exp : // fall thru
|
||||
case Interpreter::java_lang_math_fmaD : // fall thru
|
||||
case Interpreter::java_lang_math_fmaF :
|
||||
return false;
|
||||
default:
|
||||
return true;
|
||||
|
@ -4769,6 +4769,22 @@ void Assembler::vdivss(XMMRegister dst, XMMRegister nds, XMMRegister src) {
|
||||
emit_int8((unsigned char)(0xC0 | encode));
|
||||
}
|
||||
|
||||
void Assembler::vfmadd231sd(XMMRegister dst, XMMRegister src1, XMMRegister src2) {
|
||||
assert(VM_Version::supports_fma(), "");
|
||||
InstructionAttr attributes(AVX_128bit, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ false);
|
||||
int encode = vex_prefix_and_encode(dst->encoding(), src1->encoding(), src2->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);
|
||||
emit_int8((unsigned char)0xB9);
|
||||
emit_int8((unsigned char)(0xC0 | encode));
|
||||
}
|
||||
|
||||
void Assembler::vfmadd231ss(XMMRegister dst, XMMRegister src1, XMMRegister src2) {
|
||||
assert(VM_Version::supports_fma(), "");
|
||||
InstructionAttr attributes(AVX_128bit, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ false);
|
||||
int encode = vex_prefix_and_encode(dst->encoding(), src1->encoding(), src2->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);
|
||||
emit_int8((unsigned char)0xB9);
|
||||
emit_int8((unsigned char)(0xC0 | encode));
|
||||
}
|
||||
|
||||
void Assembler::vmulsd(XMMRegister dst, XMMRegister nds, Address src) {
|
||||
assert(VM_Version::supports_avx(), "");
|
||||
InstructionMark im(this);
|
||||
|
@ -1860,6 +1860,8 @@ private:
|
||||
void vdivsd(XMMRegister dst, XMMRegister nds, XMMRegister src);
|
||||
void vdivss(XMMRegister dst, XMMRegister nds, Address src);
|
||||
void vdivss(XMMRegister dst, XMMRegister nds, XMMRegister src);
|
||||
void vfmadd231sd(XMMRegister dst, XMMRegister nds, XMMRegister src);
|
||||
void vfmadd231ss(XMMRegister dst, XMMRegister nds, XMMRegister src);
|
||||
void vmulsd(XMMRegister dst, XMMRegister nds, Address src);
|
||||
void vmulsd(XMMRegister dst, XMMRegister nds, XMMRegister src);
|
||||
void vmulss(XMMRegister dst, XMMRegister nds, Address src);
|
||||
|
@ -1345,6 +1345,18 @@ void LIR_Assembler::emit_op3(LIR_Op3* op) {
|
||||
op->result_opr(),
|
||||
op->info());
|
||||
break;
|
||||
case lir_fmad:
|
||||
__ fmad(op->result_opr()->as_xmm_double_reg(),
|
||||
op->in_opr1()->as_xmm_double_reg(),
|
||||
op->in_opr2()->as_xmm_double_reg(),
|
||||
op->in_opr3()->as_xmm_double_reg());
|
||||
break;
|
||||
case lir_fmaf:
|
||||
__ fmaf(op->result_opr()->as_xmm_float_reg(),
|
||||
op->in_opr1()->as_xmm_float_reg(),
|
||||
op->in_opr2()->as_xmm_float_reg(),
|
||||
op->in_opr3()->as_xmm_float_reg());
|
||||
break;
|
||||
default: ShouldNotReachHere(); break;
|
||||
}
|
||||
}
|
||||
|
@ -152,7 +152,7 @@ LIR_Address* LIRGenerator::generate_address(LIR_Opr base, LIR_Opr index,
|
||||
assert(base->is_register(), "must be");
|
||||
if (index->is_constant()) {
|
||||
return new LIR_Address(base,
|
||||
(index->as_constant_ptr()->as_jint() << shift) + disp,
|
||||
((intx)(index->as_constant_ptr()->as_jint()) << shift) + disp,
|
||||
type);
|
||||
} else {
|
||||
return new LIR_Address(base, index, (LIR_Address::Scale)shift, disp, type);
|
||||
@ -168,7 +168,7 @@ LIR_Address* LIRGenerator::emit_array_address(LIR_Opr array_opr, LIR_Opr index_o
|
||||
if (index_opr->is_constant()) {
|
||||
int elem_size = type2aelembytes(type);
|
||||
addr = new LIR_Address(array_opr,
|
||||
offset_in_bytes + index_opr->as_jint() * elem_size, type);
|
||||
offset_in_bytes + (intx)(index_opr->as_jint()) * elem_size, type);
|
||||
} else {
|
||||
#ifdef _LP64
|
||||
if (index_opr->type() == T_INT) {
|
||||
@ -806,6 +806,32 @@ void LIRGenerator::do_CompareAndSwap(Intrinsic* x, ValueType* type) {
|
||||
}
|
||||
}
|
||||
|
||||
void LIRGenerator::do_FmaIntrinsic(Intrinsic* x) {
|
||||
assert(x->number_of_arguments() == 3, "wrong type");
|
||||
assert(UseFMA, "Needs FMA instructions support.");
|
||||
LIRItem value(x->argument_at(0), this);
|
||||
LIRItem value1(x->argument_at(1), this);
|
||||
LIRItem value2(x->argument_at(2), this);
|
||||
|
||||
value2.set_destroys_register();
|
||||
|
||||
value.load_item();
|
||||
value1.load_item();
|
||||
value2.load_item();
|
||||
|
||||
LIR_Opr calc_input = value.result();
|
||||
LIR_Opr calc_input1 = value1.result();
|
||||
LIR_Opr calc_input2 = value2.result();
|
||||
LIR_Opr calc_result = rlock_result(x);
|
||||
|
||||
switch (x->id()) {
|
||||
case vmIntrinsics::_fmaD: __ fmad(calc_input, calc_input1, calc_input2, calc_result); break;
|
||||
case vmIntrinsics::_fmaF: __ fmaf(calc_input, calc_input1, calc_input2, calc_result); break;
|
||||
default: ShouldNotReachHere();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
void LIRGenerator::do_MathIntrinsic(Intrinsic* x) {
|
||||
assert(x->number_of_arguments() == 1 || (x->number_of_arguments() == 2 && x->id() == vmIntrinsics::_dpow), "wrong type");
|
||||
|
@ -100,9 +100,11 @@ inline void LinearScan::pd_add_temps(LIR_Op* op) {
|
||||
|
||||
inline bool LinearScanWalker::pd_init_regs_for_alloc(Interval* cur) {
|
||||
int last_xmm_reg = pd_last_xmm_reg;
|
||||
#ifdef _LP64
|
||||
if (UseAVX < 3) {
|
||||
last_xmm_reg = pd_first_xmm_reg + (pd_nof_xmm_regs_frame_map / 2) - 1;
|
||||
}
|
||||
#endif
|
||||
if (allocator()->gen()->is_vreg_flag_set(cur->reg_num(), LIRGenerator::byte_reg)) {
|
||||
assert(cur->type() != T_FLOAT && cur->type() != T_DOUBLE, "cpu regs only");
|
||||
_first_reg = pd_first_byte_reg;
|
||||
|
@ -3147,6 +3147,24 @@ void MacroAssembler::fremr(Register tmp) {
|
||||
fpop();
|
||||
}
|
||||
|
||||
// dst = c = a * b + c
|
||||
void MacroAssembler::fmad(XMMRegister dst, XMMRegister a, XMMRegister b, XMMRegister c) {
|
||||
Assembler::vfmadd231sd(c, a, b);
|
||||
if (dst != c) {
|
||||
movdbl(dst, c);
|
||||
}
|
||||
}
|
||||
|
||||
// dst = c = a * b + c
|
||||
void MacroAssembler::fmaf(XMMRegister dst, XMMRegister a, XMMRegister b, XMMRegister c) {
|
||||
Assembler::vfmadd231ss(c, a, b);
|
||||
if (dst != c) {
|
||||
movflt(dst, c);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void MacroAssembler::incrementl(AddressLiteral dst) {
|
||||
if (reachable(dst)) {
|
||||
|
@ -449,6 +449,10 @@ class MacroAssembler: public Assembler {
|
||||
// tmp is a temporary register, if none is available use noreg
|
||||
void fremr(Register tmp);
|
||||
|
||||
// dst = c = a * b + c
|
||||
void fmad(XMMRegister dst, XMMRegister a, XMMRegister b, XMMRegister c);
|
||||
void fmaf(XMMRegister dst, XMMRegister a, XMMRegister b, XMMRegister c);
|
||||
|
||||
|
||||
// same as fcmp2int, but using SSE2
|
||||
void cmpss2int(XMMRegister opr1, XMMRegister opr2, Register dst, bool unordered_is_less);
|
||||
|
@ -720,19 +720,13 @@ const Register& y2 = r15;
|
||||
|
||||
enum {
|
||||
_XFER_SIZE = 2*64*4, // 2 blocks, 64 rounds, 4 bytes/round
|
||||
#ifndef _WIN64
|
||||
_XMM_SAVE_SIZE = 0,
|
||||
#else
|
||||
_XMM_SAVE_SIZE = 8*16,
|
||||
#endif
|
||||
_INP_END_SIZE = 8,
|
||||
_INP_SIZE = 8,
|
||||
_CTX_SIZE = 8,
|
||||
_RSP_SIZE = 8,
|
||||
|
||||
_XFER = 0,
|
||||
_XMM_SAVE = _XFER + _XFER_SIZE,
|
||||
_INP_END = _XMM_SAVE + _XMM_SAVE_SIZE,
|
||||
_INP_END = _XFER + _XFER_SIZE,
|
||||
_INP = _INP_END + _INP_END_SIZE,
|
||||
_CTX = _INP + _INP_SIZE,
|
||||
_RSP = _CTX + _CTX_SIZE,
|
||||
|
@ -3236,11 +3236,6 @@ class StubGenerator: public StubCodeGenerator {
|
||||
#ifdef _WIN64
|
||||
// on win64, fill len_reg from stack position
|
||||
__ movl(len_reg, len_mem);
|
||||
// save the xmm registers which must be preserved 6-15
|
||||
__ subptr(rsp, -rsp_after_call_off * wordSize);
|
||||
for (int i = 6; i <= XMM_REG_NUM_KEY_LAST; i++) {
|
||||
__ movdqu(xmm_save(i), as_XMMRegister(i));
|
||||
}
|
||||
#else
|
||||
__ push(len_reg); // Save
|
||||
#endif
|
||||
@ -3281,10 +3276,6 @@ class StubGenerator: public StubCodeGenerator {
|
||||
__ movdqu(Address(rvec, 0), xmm_result); // final value of r stored in rvec of CipherBlockChaining object
|
||||
|
||||
#ifdef _WIN64
|
||||
// restore xmm regs belonging to calling function
|
||||
for (int i = 6; i <= XMM_REG_NUM_KEY_LAST; i++) {
|
||||
__ movdqu(as_XMMRegister(i), xmm_save(i));
|
||||
}
|
||||
__ movl(rax, len_mem);
|
||||
#else
|
||||
__ pop(rax); // return length
|
||||
@ -3446,11 +3437,6 @@ class StubGenerator: public StubCodeGenerator {
|
||||
#ifdef _WIN64
|
||||
// on win64, fill len_reg from stack position
|
||||
__ movl(len_reg, len_mem);
|
||||
// save the xmm registers which must be preserved 6-15
|
||||
__ subptr(rsp, -rsp_after_call_off * wordSize);
|
||||
for (int i = 6; i <= XMM_REG_NUM_KEY_LAST; i++) {
|
||||
__ movdqu(xmm_save(i), as_XMMRegister(i));
|
||||
}
|
||||
#else
|
||||
__ push(len_reg); // Save
|
||||
#endif
|
||||
@ -3644,10 +3630,6 @@ class StubGenerator: public StubCodeGenerator {
|
||||
__ movdqu(Address(rvec, 0), xmm_prev_block_cipher); // final value of r stored in rvec of CipherBlockChaining object
|
||||
__ pop(rbx);
|
||||
#ifdef _WIN64
|
||||
// restore regs belonging to calling function
|
||||
for (int i = 6; i <= XMM_REG_NUM_KEY_LAST; i++) {
|
||||
__ movdqu(as_XMMRegister(i), xmm_save(i));
|
||||
}
|
||||
__ movl(rax, len_mem);
|
||||
#else
|
||||
__ pop(rax); // return length
|
||||
@ -3699,25 +3681,12 @@ class StubGenerator: public StubCodeGenerator {
|
||||
|
||||
__ enter();
|
||||
|
||||
#ifdef _WIN64
|
||||
// save the xmm registers which must be preserved 6-7
|
||||
__ subptr(rsp, 4 * wordSize);
|
||||
__ movdqu(Address(rsp, 0), xmm6);
|
||||
__ movdqu(Address(rsp, 2 * wordSize), xmm7);
|
||||
#endif
|
||||
|
||||
__ subptr(rsp, 4 * wordSize);
|
||||
|
||||
__ fast_sha1(abcd, e0, e1, msg0, msg1, msg2, msg3, shuf_mask,
|
||||
buf, state, ofs, limit, rsp, multi_block);
|
||||
|
||||
__ addptr(rsp, 4 * wordSize);
|
||||
#ifdef _WIN64
|
||||
// restore xmm regs belonging to calling function
|
||||
__ movdqu(xmm6, Address(rsp, 0));
|
||||
__ movdqu(xmm7, Address(rsp, 2 * wordSize));
|
||||
__ addptr(rsp, 4 * wordSize);
|
||||
#endif
|
||||
|
||||
__ leave();
|
||||
__ ret(0);
|
||||
@ -3775,22 +3744,6 @@ class StubGenerator: public StubCodeGenerator {
|
||||
const XMMRegister shuf_mask = xmm8;
|
||||
|
||||
__ enter();
|
||||
#ifdef _WIN64
|
||||
// save the xmm registers which must be preserved 6-7
|
||||
__ subptr(rsp, 6 * wordSize);
|
||||
__ movdqu(Address(rsp, 0), xmm6);
|
||||
__ movdqu(Address(rsp, 2 * wordSize), xmm7);
|
||||
__ movdqu(Address(rsp, 4 * wordSize), xmm8);
|
||||
|
||||
if (!VM_Version::supports_sha() && VM_Version::supports_avx2()) {
|
||||
__ subptr(rsp, 10 * wordSize);
|
||||
__ movdqu(Address(rsp, 0), xmm9);
|
||||
__ movdqu(Address(rsp, 2 * wordSize), xmm10);
|
||||
__ movdqu(Address(rsp, 4 * wordSize), xmm11);
|
||||
__ movdqu(Address(rsp, 6 * wordSize), xmm12);
|
||||
__ movdqu(Address(rsp, 8 * wordSize), xmm13);
|
||||
}
|
||||
#endif
|
||||
|
||||
__ subptr(rsp, 4 * wordSize);
|
||||
|
||||
@ -3802,21 +3755,7 @@ class StubGenerator: public StubCodeGenerator {
|
||||
buf, state, ofs, limit, rsp, multi_block, shuf_mask);
|
||||
}
|
||||
__ addptr(rsp, 4 * wordSize);
|
||||
#ifdef _WIN64
|
||||
// restore xmm regs belonging to calling function
|
||||
if (!VM_Version::supports_sha() && VM_Version::supports_avx2()) {
|
||||
__ movdqu(xmm9, Address(rsp, 0));
|
||||
__ movdqu(xmm10, Address(rsp, 2 * wordSize));
|
||||
__ movdqu(xmm11, Address(rsp, 4 * wordSize));
|
||||
__ movdqu(xmm12, Address(rsp, 6 * wordSize));
|
||||
__ movdqu(xmm13, Address(rsp, 8 * wordSize));
|
||||
__ addptr(rsp, 10 * wordSize);
|
||||
}
|
||||
__ movdqu(xmm6, Address(rsp, 0));
|
||||
__ movdqu(xmm7, Address(rsp, 2 * wordSize));
|
||||
__ movdqu(xmm8, Address(rsp, 4 * wordSize));
|
||||
__ addptr(rsp, 6 * wordSize);
|
||||
#endif
|
||||
|
||||
__ leave();
|
||||
__ ret(0);
|
||||
return start;
|
||||
@ -3917,18 +3856,14 @@ class StubGenerator: public StubCodeGenerator {
|
||||
}
|
||||
|
||||
#ifdef _WIN64
|
||||
// save the xmm registers which must be preserved 6-14
|
||||
const int XMM_REG_NUM_KEY_LAST = 14;
|
||||
__ subptr(rsp, -rsp_after_call_off * wordSize);
|
||||
for (int i = 6; i <= XMM_REG_NUM_KEY_LAST; i++) {
|
||||
__ movdqu(xmm_save(i), as_XMMRegister(i));
|
||||
}
|
||||
|
||||
const Address r13_save(rbp, rdi_off * wordSize);
|
||||
const Address r14_save(rbp, rsi_off * wordSize);
|
||||
|
||||
__ movptr(r13_save, r13);
|
||||
__ movptr(r14_save, r14);
|
||||
// allocate spill slots for r13, r14
|
||||
enum {
|
||||
saved_r13_offset,
|
||||
saved_r14_offset
|
||||
};
|
||||
__ subptr(rsp, 2 * wordSize);
|
||||
__ movptr(Address(rsp, saved_r13_offset * wordSize), r13);
|
||||
__ movptr(Address(rsp, saved_r14_offset * wordSize), r14);
|
||||
|
||||
// on win64, fill len_reg from stack position
|
||||
__ movl(len_reg, len_mem);
|
||||
@ -4130,13 +4065,10 @@ class StubGenerator: public StubCodeGenerator {
|
||||
__ movdqu(Address(counter, 0), xmm_curr_counter); //save counter back
|
||||
__ pop(rbx); // pop the saved RBX.
|
||||
#ifdef _WIN64
|
||||
// restore regs belonging to calling function
|
||||
for (int i = 6; i <= XMM_REG_NUM_KEY_LAST; i++) {
|
||||
__ movdqu(as_XMMRegister(i), xmm_save(i));
|
||||
}
|
||||
__ movl(rax, len_mem);
|
||||
__ movptr(r13, r13_save);
|
||||
__ movptr(r14, r14_save);
|
||||
__ movptr(r13, Address(rsp, saved_r13_offset * wordSize));
|
||||
__ movptr(r14, Address(rsp, saved_r14_offset * wordSize));
|
||||
__ addptr(rsp, 2 * wordSize);
|
||||
#else
|
||||
__ pop(rax); // return 'len'
|
||||
#endif
|
||||
@ -4177,10 +4109,6 @@ class StubGenerator: public StubCodeGenerator {
|
||||
const Register data = c_rarg2;
|
||||
const Register blocks = c_rarg3;
|
||||
|
||||
#ifdef _WIN64
|
||||
const int XMM_REG_LAST = 10;
|
||||
#endif
|
||||
|
||||
const XMMRegister xmm_temp0 = xmm0;
|
||||
const XMMRegister xmm_temp1 = xmm1;
|
||||
const XMMRegister xmm_temp2 = xmm2;
|
||||
@ -4203,14 +4131,6 @@ class StubGenerator: public StubCodeGenerator {
|
||||
__ kmovql(k1, rax);
|
||||
}
|
||||
|
||||
#ifdef _WIN64
|
||||
// save the xmm registers which must be preserved 6-10
|
||||
__ subptr(rsp, -rsp_after_call_off * wordSize);
|
||||
for (int i = 6; i <= XMM_REG_LAST; i++) {
|
||||
__ movdqu(xmm_save(i), as_XMMRegister(i));
|
||||
}
|
||||
#endif
|
||||
|
||||
__ movdqu(xmm_temp10, ExternalAddress(StubRoutines::x86::ghash_long_swap_mask_addr()));
|
||||
|
||||
__ movdqu(xmm_temp0, Address(state, 0));
|
||||
@ -4310,12 +4230,6 @@ class StubGenerator: public StubCodeGenerator {
|
||||
__ pshufb(xmm_temp6, xmm_temp10); // Byte swap 16-byte result
|
||||
__ movdqu(Address(state, 0), xmm_temp6); // store the result
|
||||
|
||||
#ifdef _WIN64
|
||||
// restore xmm regs belonging to calling function
|
||||
for (int i = 6; i <= XMM_REG_LAST; i++) {
|
||||
__ movdqu(as_XMMRegister(i), xmm_save(i));
|
||||
}
|
||||
#endif
|
||||
__ leave();
|
||||
__ ret(0);
|
||||
return start;
|
||||
@ -4652,21 +4566,8 @@ class StubGenerator: public StubCodeGenerator {
|
||||
BLOCK_COMMENT("Entry:");
|
||||
__ enter(); // required for proper stackwalking of RuntimeStub frame
|
||||
|
||||
#ifdef _WIN64
|
||||
// save the xmm registers which must be preserved 6-7
|
||||
__ subptr(rsp, 4 * wordSize);
|
||||
__ movdqu(Address(rsp, 0), xmm6);
|
||||
__ movdqu(Address(rsp, 2 * wordSize), xmm7);
|
||||
#endif
|
||||
__ fast_exp(x0, x1, x2, x3, x4, x5, x6, x7, rax, rcx, rdx, tmp);
|
||||
|
||||
#ifdef _WIN64
|
||||
// restore xmm regs belonging to calling function
|
||||
__ movdqu(xmm6, Address(rsp, 0));
|
||||
__ movdqu(xmm7, Address(rsp, 2 * wordSize));
|
||||
__ addptr(rsp, 4 * wordSize);
|
||||
#endif
|
||||
|
||||
__ leave(); // required for proper stackwalking of RuntimeStub frame
|
||||
__ ret(0);
|
||||
|
||||
@ -4693,21 +4594,8 @@ class StubGenerator: public StubCodeGenerator {
|
||||
BLOCK_COMMENT("Entry:");
|
||||
__ enter(); // required for proper stackwalking of RuntimeStub frame
|
||||
|
||||
#ifdef _WIN64
|
||||
// save the xmm registers which must be preserved 6-7
|
||||
__ subptr(rsp, 4 * wordSize);
|
||||
__ movdqu(Address(rsp, 0), xmm6);
|
||||
__ movdqu(Address(rsp, 2 * wordSize), xmm7);
|
||||
#endif
|
||||
__ fast_log(x0, x1, x2, x3, x4, x5, x6, x7, rax, rcx, rdx, tmp1, tmp2);
|
||||
|
||||
#ifdef _WIN64
|
||||
// restore xmm regs belonging to calling function
|
||||
__ movdqu(xmm6, Address(rsp, 0));
|
||||
__ movdqu(xmm7, Address(rsp, 2 * wordSize));
|
||||
__ addptr(rsp, 4 * wordSize);
|
||||
#endif
|
||||
|
||||
__ leave(); // required for proper stackwalking of RuntimeStub frame
|
||||
__ ret(0);
|
||||
|
||||
@ -4733,21 +4621,8 @@ class StubGenerator: public StubCodeGenerator {
|
||||
BLOCK_COMMENT("Entry:");
|
||||
__ enter(); // required for proper stackwalking of RuntimeStub frame
|
||||
|
||||
#ifdef _WIN64
|
||||
// save the xmm registers which must be preserved 6-7
|
||||
__ subptr(rsp, 4 * wordSize);
|
||||
__ movdqu(Address(rsp, 0), xmm6);
|
||||
__ movdqu(Address(rsp, 2 * wordSize), xmm7);
|
||||
#endif
|
||||
__ fast_log10(x0, x1, x2, x3, x4, x5, x6, x7, rax, rcx, rdx, tmp);
|
||||
|
||||
#ifdef _WIN64
|
||||
// restore xmm regs belonging to calling function
|
||||
__ movdqu(xmm6, Address(rsp, 0));
|
||||
__ movdqu(xmm7, Address(rsp, 2 * wordSize));
|
||||
__ addptr(rsp, 4 * wordSize);
|
||||
#endif
|
||||
|
||||
__ leave(); // required for proper stackwalking of RuntimeStub frame
|
||||
__ ret(0);
|
||||
|
||||
@ -4776,21 +4651,8 @@ class StubGenerator: public StubCodeGenerator {
|
||||
BLOCK_COMMENT("Entry:");
|
||||
__ enter(); // required for proper stackwalking of RuntimeStub frame
|
||||
|
||||
#ifdef _WIN64
|
||||
// save the xmm registers which must be preserved 6-7
|
||||
__ subptr(rsp, 4 * wordSize);
|
||||
__ movdqu(Address(rsp, 0), xmm6);
|
||||
__ movdqu(Address(rsp, 2 * wordSize), xmm7);
|
||||
#endif
|
||||
__ fast_pow(x0, x1, x2, x3, x4, x5, x6, x7, rax, rcx, rdx, tmp1, tmp2, tmp3, tmp4);
|
||||
|
||||
#ifdef _WIN64
|
||||
// restore xmm regs belonging to calling function
|
||||
__ movdqu(xmm6, Address(rsp, 0));
|
||||
__ movdqu(xmm7, Address(rsp, 2 * wordSize));
|
||||
__ addptr(rsp, 4 * wordSize);
|
||||
#endif
|
||||
|
||||
__ leave(); // required for proper stackwalking of RuntimeStub frame
|
||||
__ ret(0);
|
||||
|
||||
@ -4822,18 +4684,10 @@ class StubGenerator: public StubCodeGenerator {
|
||||
#ifdef _WIN64
|
||||
__ push(rsi);
|
||||
__ push(rdi);
|
||||
// save the xmm registers which must be preserved 6-7
|
||||
__ subptr(rsp, 4 * wordSize);
|
||||
__ movdqu(Address(rsp, 0), xmm6);
|
||||
__ movdqu(Address(rsp, 2 * wordSize), xmm7);
|
||||
#endif
|
||||
__ fast_sin(x0, x1, x2, x3, x4, x5, x6, x7, rax, rbx, rcx, rdx, tmp1, tmp2, tmp3, tmp4);
|
||||
|
||||
#ifdef _WIN64
|
||||
// restore xmm regs belonging to calling function
|
||||
__ movdqu(xmm6, Address(rsp, 0));
|
||||
__ movdqu(xmm7, Address(rsp, 2 * wordSize));
|
||||
__ addptr(rsp, 4 * wordSize);
|
||||
__ pop(rdi);
|
||||
__ pop(rsi);
|
||||
#endif
|
||||
@ -4869,18 +4723,10 @@ class StubGenerator: public StubCodeGenerator {
|
||||
#ifdef _WIN64
|
||||
__ push(rsi);
|
||||
__ push(rdi);
|
||||
// save the xmm registers which must be preserved 6-7
|
||||
__ subptr(rsp, 4 * wordSize);
|
||||
__ movdqu(Address(rsp, 0), xmm6);
|
||||
__ movdqu(Address(rsp, 2 * wordSize), xmm7);
|
||||
#endif
|
||||
__ fast_cos(x0, x1, x2, x3, x4, x5, x6, x7, rax, rcx, rdx, tmp1, tmp2, tmp3, tmp4);
|
||||
|
||||
#ifdef _WIN64
|
||||
// restore xmm regs belonging to calling function
|
||||
__ movdqu(xmm6, Address(rsp, 0));
|
||||
__ movdqu(xmm7, Address(rsp, 2 * wordSize));
|
||||
__ addptr(rsp, 4 * wordSize);
|
||||
__ pop(rdi);
|
||||
__ pop(rsi);
|
||||
#endif
|
||||
@ -4916,18 +4762,10 @@ class StubGenerator: public StubCodeGenerator {
|
||||
#ifdef _WIN64
|
||||
__ push(rsi);
|
||||
__ push(rdi);
|
||||
// save the xmm registers which must be preserved 6-7
|
||||
__ subptr(rsp, 4 * wordSize);
|
||||
__ movdqu(Address(rsp, 0), xmm6);
|
||||
__ movdqu(Address(rsp, 2 * wordSize), xmm7);
|
||||
#endif
|
||||
__ fast_tan(x0, x1, x2, x3, x4, x5, x6, x7, rax, rcx, rdx, tmp1, tmp2, tmp3, tmp4);
|
||||
|
||||
#ifdef _WIN64
|
||||
// restore xmm regs belonging to calling function
|
||||
__ movdqu(xmm6, Address(rsp, 0));
|
||||
__ movdqu(xmm7, Address(rsp, 2 * wordSize));
|
||||
__ addptr(rsp, 4 * wordSize);
|
||||
__ pop(rdi);
|
||||
__ pop(rsi);
|
||||
#endif
|
||||
|
@ -55,7 +55,7 @@
|
||||
// Run with +PrintInterpreter to get the VM to print out the size.
|
||||
// Max size with JVMTI
|
||||
#ifdef AMD64
|
||||
int TemplateInterpreter::InterpreterCodeSize = 256 * 1024;
|
||||
int TemplateInterpreter::InterpreterCodeSize = JVMCI_ONLY(268) NOT_JVMCI(256) * 1024;
|
||||
#else
|
||||
int TemplateInterpreter::InterpreterCodeSize = 224 * 1024;
|
||||
#endif // AMD64
|
||||
|
@ -341,6 +341,27 @@ address TemplateInterpreterGenerator::generate_math_entry(AbstractInterpreter::M
|
||||
// [ lo(arg) ]
|
||||
// [ hi(arg) ]
|
||||
//
|
||||
if (kind == Interpreter::java_lang_math_fmaD) {
|
||||
__ movdbl(xmm2, Address(rsp, 5 * wordSize));
|
||||
__ movdbl(xmm1, Address(rsp, 3 * wordSize));
|
||||
__ movdbl(xmm0, Address(rsp, 1 * wordSize));
|
||||
__ fmad(xmm0, xmm1, xmm2, xmm0);
|
||||
__ pop(rdi); // get return address
|
||||
__ mov(rsp, rsi); // set sp to sender sp
|
||||
__ jmp(rdi);
|
||||
|
||||
return entry_point;
|
||||
} else if (kind == Interpreter::java_lang_math_fmaF) {
|
||||
__ movflt(xmm2, Address(rsp, 3 * wordSize));
|
||||
__ movflt(xmm1, Address(rsp, 2 * wordSize));
|
||||
__ movflt(xmm0, Address(rsp, 1 * wordSize));
|
||||
__ fmaf(xmm0, xmm1, xmm2, xmm0);
|
||||
__ pop(rdi); // get return address
|
||||
__ mov(rsp, rsi); // set sp to sender sp
|
||||
__ jmp(rdi);
|
||||
|
||||
return entry_point;
|
||||
}
|
||||
|
||||
__ fld_d(Address(rsp, 1*wordSize));
|
||||
switch (kind) {
|
||||
|
@ -369,8 +369,17 @@ address TemplateInterpreterGenerator::generate_math_entry(AbstractInterpreter::M
|
||||
// [ hi(arg) ]
|
||||
//
|
||||
|
||||
|
||||
if (kind == Interpreter::java_lang_math_sqrt) {
|
||||
if (kind == Interpreter::java_lang_math_fmaD) {
|
||||
__ movdbl(xmm0, Address(rsp, wordSize));
|
||||
__ movdbl(xmm1, Address(rsp, 3 * wordSize));
|
||||
__ movdbl(xmm2, Address(rsp, 5 * wordSize));
|
||||
__ fmad(xmm0, xmm1, xmm2, xmm0);
|
||||
} else if (kind == Interpreter::java_lang_math_fmaF) {
|
||||
__ movflt(xmm0, Address(rsp, wordSize));
|
||||
__ movflt(xmm1, Address(rsp, 2 * wordSize));
|
||||
__ movflt(xmm2, Address(rsp, 3 * wordSize));
|
||||
__ fmaf(xmm0, xmm1, xmm2, xmm0);
|
||||
} else if (kind == Interpreter::java_lang_math_sqrt) {
|
||||
__ sqrtsd(xmm0, Address(rsp, wordSize));
|
||||
} else if (kind == Interpreter::java_lang_math_exp) {
|
||||
__ movdbl(xmm0, Address(rsp, wordSize));
|
||||
|
@ -73,6 +73,7 @@
|
||||
#define VM_LONG_CONSTANTS_CPU(declare_constant, declare_preprocessor_constant, declare_c1_constant, declare_c2_constant, declare_c2_preprocessor_constant) \
|
||||
declare_preprocessor_constant("VM_Version::CPU_AVX512BW", CPU_AVX512BW) \
|
||||
declare_preprocessor_constant("VM_Version::CPU_AVX512VL", CPU_AVX512VL) \
|
||||
declare_preprocessor_constant("VM_Version::CPU_SHA", CPU_SHA)
|
||||
declare_preprocessor_constant("VM_Version::CPU_SHA", CPU_SHA) \
|
||||
declare_preprocessor_constant("VM_Version::CPU_FMA", CPU_FMA)
|
||||
|
||||
#endif // CPU_X86_VM_VMSTRUCTS_X86_HPP
|
||||
|
@ -578,7 +578,7 @@ void VM_Version::get_processor_features() {
|
||||
}
|
||||
|
||||
char buf[256];
|
||||
jio_snprintf(buf, sizeof(buf), "(%u cores per cpu, %u threads per core) family %d model %d stepping %d%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s",
|
||||
jio_snprintf(buf, sizeof(buf), "(%u cores per cpu, %u threads per core) family %d model %d stepping %d%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s",
|
||||
cores_per_cpu(), threads_per_core(),
|
||||
cpu_family(), _model, _stepping,
|
||||
(supports_cmov() ? ", cmov" : ""),
|
||||
@ -610,7 +610,8 @@ void VM_Version::get_processor_features() {
|
||||
(supports_bmi2() ? ", bmi2" : ""),
|
||||
(supports_adx() ? ", adx" : ""),
|
||||
(supports_evex() ? ", evex" : ""),
|
||||
(supports_sha() ? ", sha" : ""));
|
||||
(supports_sha() ? ", sha" : ""),
|
||||
(supports_fma() ? ", fma" : ""));
|
||||
_features_string = os::strdup(buf);
|
||||
|
||||
// UseSSE is set to the smaller of what hardware supports and what
|
||||
@ -732,6 +733,15 @@ void VM_Version::get_processor_features() {
|
||||
FLAG_SET_DEFAULT(UseGHASHIntrinsics, false);
|
||||
}
|
||||
|
||||
if (supports_fma() && UseSSE >= 2) {
|
||||
if (FLAG_IS_DEFAULT(UseFMA)) {
|
||||
UseFMA = true;
|
||||
}
|
||||
} else if (UseFMA) {
|
||||
warning("FMA instructions are not available on this CPU");
|
||||
FLAG_SET_DEFAULT(UseFMA, false);
|
||||
}
|
||||
|
||||
if (supports_sha() LP64_ONLY(|| supports_avx2() && supports_bmi2())) {
|
||||
if (FLAG_IS_DEFAULT(UseSHA)) {
|
||||
UseSHA = true;
|
||||
@ -773,7 +783,6 @@ void VM_Version::get_processor_features() {
|
||||
FLAG_SET_DEFAULT(UseAdler32Intrinsics, false);
|
||||
}
|
||||
|
||||
// Adjust RTM (Restricted Transactional Memory) flags
|
||||
if (!supports_rtm() && UseRTMLocking) {
|
||||
// Can't continue because UseRTMLocking affects UseBiasedLocking flag
|
||||
// setting during arguments processing. See use_biased_locking().
|
||||
|
@ -74,7 +74,8 @@ class VM_Version : public Abstract_VM_Version {
|
||||
: 1,
|
||||
ssse3 : 1,
|
||||
cid : 1,
|
||||
: 2,
|
||||
: 1,
|
||||
fma : 1,
|
||||
cmpxchg16: 1,
|
||||
: 4,
|
||||
dca : 1,
|
||||
@ -289,6 +290,7 @@ protected:
|
||||
#define CPU_AVX512BW ((uint64_t)UCONST64(0x100000000)) // enums are limited to 31 bit
|
||||
#define CPU_AVX512VL ((uint64_t)UCONST64(0x200000000)) // EVEX instructions with smaller vector length
|
||||
#define CPU_SHA ((uint64_t)UCONST64(0x400000000)) // SHA instructions
|
||||
#define CPU_FMA ((uint64_t)UCONST64(0x800000000)) // FMA instructions
|
||||
|
||||
enum Extended_Family {
|
||||
// AMD
|
||||
@ -522,6 +524,8 @@ protected:
|
||||
result |= CPU_SHA;
|
||||
if(_cpuid_info.ext_cpuid1_ecx.bits.lzcnt_intel != 0)
|
||||
result |= CPU_LZCNT;
|
||||
if (_cpuid_info.std_cpuid1_ecx.bits.fma != 0)
|
||||
result |= CPU_FMA;
|
||||
// for Intel, ecx.bits.misalignsse bit (bit 8) indicates support for prefetchw
|
||||
if (_cpuid_info.ext_cpuid1_ecx.bits.misalignsse != 0) {
|
||||
result |= CPU_3DNOW_PREFETCH;
|
||||
@ -726,6 +730,7 @@ public:
|
||||
static bool supports_avx256only() { return (supports_avx2() && !supports_evex()); }
|
||||
static bool supports_avxonly() { return ((supports_avx2() || supports_avx()) && !supports_evex()); }
|
||||
static bool supports_sha() { return (_features & CPU_SHA) != 0; }
|
||||
static bool supports_fma() { return (_features & CPU_FMA) != 0; }
|
||||
// Intel features
|
||||
static bool is_intel_family_core() { return is_intel() &&
|
||||
extended_cpu_family() == CPU_FAMILY_INTEL_CORE; }
|
||||
|
@ -176,451 +176,6 @@ reg_def XMM5n( SOC, SOC, Op_RegF, 5, xmm5->as_VMReg()->next(13));
|
||||
reg_def XMM5o( SOC, SOC, Op_RegF, 5, xmm5->as_VMReg()->next(14));
|
||||
reg_def XMM5p( SOC, SOC, Op_RegF, 5, xmm5->as_VMReg()->next(15));
|
||||
|
||||
#ifdef _WIN64
|
||||
|
||||
reg_def XMM6 ( SOC, SOE, Op_RegF, 6, xmm6->as_VMReg());
|
||||
reg_def XMM6b( SOC, SOE, Op_RegF, 6, xmm6->as_VMReg()->next(1));
|
||||
reg_def XMM6c( SOC, SOE, Op_RegF, 6, xmm6->as_VMReg()->next(2));
|
||||
reg_def XMM6d( SOC, SOE, Op_RegF, 6, xmm6->as_VMReg()->next(3));
|
||||
reg_def XMM6e( SOC, SOE, Op_RegF, 6, xmm6->as_VMReg()->next(4));
|
||||
reg_def XMM6f( SOC, SOE, Op_RegF, 6, xmm6->as_VMReg()->next(5));
|
||||
reg_def XMM6g( SOC, SOE, Op_RegF, 6, xmm6->as_VMReg()->next(6));
|
||||
reg_def XMM6h( SOC, SOE, Op_RegF, 6, xmm6->as_VMReg()->next(7));
|
||||
reg_def XMM6i( SOC, SOE, Op_RegF, 6, xmm6->as_VMReg()->next(8));
|
||||
reg_def XMM6j( SOC, SOE, Op_RegF, 6, xmm6->as_VMReg()->next(9));
|
||||
reg_def XMM6k( SOC, SOE, Op_RegF, 6, xmm6->as_VMReg()->next(10));
|
||||
reg_def XMM6l( SOC, SOE, Op_RegF, 6, xmm6->as_VMReg()->next(11));
|
||||
reg_def XMM6m( SOC, SOE, Op_RegF, 6, xmm6->as_VMReg()->next(12));
|
||||
reg_def XMM6n( SOC, SOE, Op_RegF, 6, xmm6->as_VMReg()->next(13));
|
||||
reg_def XMM6o( SOC, SOE, Op_RegF, 6, xmm6->as_VMReg()->next(14));
|
||||
reg_def XMM6p( SOC, SOE, Op_RegF, 6, xmm6->as_VMReg()->next(15));
|
||||
|
||||
reg_def XMM7 ( SOC, SOE, Op_RegF, 7, xmm7->as_VMReg());
|
||||
reg_def XMM7b( SOC, SOE, Op_RegF, 7, xmm7->as_VMReg()->next(1));
|
||||
reg_def XMM7c( SOC, SOE, Op_RegF, 7, xmm7->as_VMReg()->next(2));
|
||||
reg_def XMM7d( SOC, SOE, Op_RegF, 7, xmm7->as_VMReg()->next(3));
|
||||
reg_def XMM7e( SOC, SOE, Op_RegF, 7, xmm7->as_VMReg()->next(4));
|
||||
reg_def XMM7f( SOC, SOE, Op_RegF, 7, xmm7->as_VMReg()->next(5));
|
||||
reg_def XMM7g( SOC, SOE, Op_RegF, 7, xmm7->as_VMReg()->next(6));
|
||||
reg_def XMM7h( SOC, SOE, Op_RegF, 7, xmm7->as_VMReg()->next(7));
|
||||
reg_def XMM7i( SOC, SOE, Op_RegF, 7, xmm7->as_VMReg()->next(8));
|
||||
reg_def XMM7j( SOC, SOE, Op_RegF, 7, xmm7->as_VMReg()->next(9));
|
||||
reg_def XMM7k( SOC, SOE, Op_RegF, 7, xmm7->as_VMReg()->next(10));
|
||||
reg_def XMM7l( SOC, SOE, Op_RegF, 7, xmm7->as_VMReg()->next(11));
|
||||
reg_def XMM7m( SOC, SOE, Op_RegF, 7, xmm7->as_VMReg()->next(12));
|
||||
reg_def XMM7n( SOC, SOE, Op_RegF, 7, xmm7->as_VMReg()->next(13));
|
||||
reg_def XMM7o( SOC, SOE, Op_RegF, 7, xmm7->as_VMReg()->next(14));
|
||||
reg_def XMM7p( SOC, SOE, Op_RegF, 7, xmm7->as_VMReg()->next(15));
|
||||
|
||||
reg_def XMM8 ( SOC, SOE, Op_RegF, 8, xmm8->as_VMReg());
|
||||
reg_def XMM8b( SOC, SOE, Op_RegF, 8, xmm8->as_VMReg()->next(1));
|
||||
reg_def XMM8c( SOC, SOE, Op_RegF, 8, xmm8->as_VMReg()->next(2));
|
||||
reg_def XMM8d( SOC, SOE, Op_RegF, 8, xmm8->as_VMReg()->next(3));
|
||||
reg_def XMM8e( SOC, SOE, Op_RegF, 8, xmm8->as_VMReg()->next(4));
|
||||
reg_def XMM8f( SOC, SOE, Op_RegF, 8, xmm8->as_VMReg()->next(5));
|
||||
reg_def XMM8g( SOC, SOE, Op_RegF, 8, xmm8->as_VMReg()->next(6));
|
||||
reg_def XMM8h( SOC, SOE, Op_RegF, 8, xmm8->as_VMReg()->next(7));
|
||||
reg_def XMM8i( SOC, SOE, Op_RegF, 8, xmm8->as_VMReg()->next(8));
|
||||
reg_def XMM8j( SOC, SOE, Op_RegF, 8, xmm8->as_VMReg()->next(9));
|
||||
reg_def XMM8k( SOC, SOE, Op_RegF, 8, xmm8->as_VMReg()->next(10));
|
||||
reg_def XMM8l( SOC, SOE, Op_RegF, 8, xmm8->as_VMReg()->next(11));
|
||||
reg_def XMM8m( SOC, SOE, Op_RegF, 8, xmm8->as_VMReg()->next(12));
|
||||
reg_def XMM8n( SOC, SOE, Op_RegF, 8, xmm8->as_VMReg()->next(13));
|
||||
reg_def XMM8o( SOC, SOE, Op_RegF, 8, xmm8->as_VMReg()->next(14));
|
||||
reg_def XMM8p( SOC, SOE, Op_RegF, 8, xmm8->as_VMReg()->next(15));
|
||||
|
||||
reg_def XMM9 ( SOC, SOE, Op_RegF, 9, xmm9->as_VMReg());
|
||||
reg_def XMM9b( SOC, SOE, Op_RegF, 9, xmm9->as_VMReg()->next(1));
|
||||
reg_def XMM9c( SOC, SOE, Op_RegF, 9, xmm9->as_VMReg()->next(2));
|
||||
reg_def XMM9d( SOC, SOE, Op_RegF, 9, xmm9->as_VMReg()->next(3));
|
||||
reg_def XMM9e( SOC, SOE, Op_RegF, 9, xmm9->as_VMReg()->next(4));
|
||||
reg_def XMM9f( SOC, SOE, Op_RegF, 9, xmm9->as_VMReg()->next(5));
|
||||
reg_def XMM9g( SOC, SOE, Op_RegF, 9, xmm9->as_VMReg()->next(6));
|
||||
reg_def XMM9h( SOC, SOE, Op_RegF, 9, xmm9->as_VMReg()->next(7));
|
||||
reg_def XMM9i( SOC, SOE, Op_RegF, 9, xmm9->as_VMReg()->next(8));
|
||||
reg_def XMM9j( SOC, SOE, Op_RegF, 9, xmm9->as_VMReg()->next(9));
|
||||
reg_def XMM9k( SOC, SOE, Op_RegF, 9, xmm9->as_VMReg()->next(10));
|
||||
reg_def XMM9l( SOC, SOE, Op_RegF, 9, xmm9->as_VMReg()->next(11));
|
||||
reg_def XMM9m( SOC, SOE, Op_RegF, 9, xmm9->as_VMReg()->next(12));
|
||||
reg_def XMM9n( SOC, SOE, Op_RegF, 9, xmm9->as_VMReg()->next(13));
|
||||
reg_def XMM9o( SOC, SOE, Op_RegF, 9, xmm9->as_VMReg()->next(14));
|
||||
reg_def XMM9p( SOC, SOE, Op_RegF, 9, xmm9->as_VMReg()->next(15));
|
||||
|
||||
reg_def XMM10 ( SOC, SOE, Op_RegF, 10, xmm10->as_VMReg());
|
||||
reg_def XMM10b( SOC, SOE, Op_RegF, 10, xmm10->as_VMReg()->next(1));
|
||||
reg_def XMM10c( SOC, SOE, Op_RegF, 10, xmm10->as_VMReg()->next(2));
|
||||
reg_def XMM10d( SOC, SOE, Op_RegF, 10, xmm10->as_VMReg()->next(3));
|
||||
reg_def XMM10e( SOC, SOE, Op_RegF, 10, xmm10->as_VMReg()->next(4));
|
||||
reg_def XMM10f( SOC, SOE, Op_RegF, 10, xmm10->as_VMReg()->next(5));
|
||||
reg_def XMM10g( SOC, SOE, Op_RegF, 10, xmm10->as_VMReg()->next(6));
|
||||
reg_def XMM10h( SOC, SOE, Op_RegF, 10, xmm10->as_VMReg()->next(7));
|
||||
reg_def XMM10i( SOC, SOE, Op_RegF, 10, xmm10->as_VMReg()->next(8));
|
||||
reg_def XMM10j( SOC, SOE, Op_RegF, 10, xmm10->as_VMReg()->next(9));
|
||||
reg_def XMM10k( SOC, SOE, Op_RegF, 10, xmm10->as_VMReg()->next(10));
|
||||
reg_def XMM10l( SOC, SOE, Op_RegF, 10, xmm10->as_VMReg()->next(11));
|
||||
reg_def XMM10m( SOC, SOE, Op_RegF, 10, xmm10->as_VMReg()->next(12));
|
||||
reg_def XMM10n( SOC, SOE, Op_RegF, 10, xmm10->as_VMReg()->next(13));
|
||||
reg_def XMM10o( SOC, SOE, Op_RegF, 10, xmm10->as_VMReg()->next(14));
|
||||
reg_def XMM10p( SOC, SOE, Op_RegF, 10, xmm10->as_VMReg()->next(15));
|
||||
|
||||
reg_def XMM11 ( SOC, SOE, Op_RegF, 11, xmm11->as_VMReg());
|
||||
reg_def XMM11b( SOC, SOE, Op_RegF, 11, xmm11->as_VMReg()->next(1));
|
||||
reg_def XMM11c( SOC, SOE, Op_RegF, 11, xmm11->as_VMReg()->next(2));
|
||||
reg_def XMM11d( SOC, SOE, Op_RegF, 11, xmm11->as_VMReg()->next(3));
|
||||
reg_def XMM11e( SOC, SOE, Op_RegF, 11, xmm11->as_VMReg()->next(4));
|
||||
reg_def XMM11f( SOC, SOE, Op_RegF, 11, xmm11->as_VMReg()->next(5));
|
||||
reg_def XMM11g( SOC, SOE, Op_RegF, 11, xmm11->as_VMReg()->next(6));
|
||||
reg_def XMM11h( SOC, SOE, Op_RegF, 11, xmm11->as_VMReg()->next(7));
|
||||
reg_def XMM11i( SOC, SOE, Op_RegF, 11, xmm11->as_VMReg()->next(8));
|
||||
reg_def XMM11j( SOC, SOE, Op_RegF, 11, xmm11->as_VMReg()->next(9));
|
||||
reg_def XMM11k( SOC, SOE, Op_RegF, 11, xmm11->as_VMReg()->next(10));
|
||||
reg_def XMM11l( SOC, SOE, Op_RegF, 11, xmm11->as_VMReg()->next(11));
|
||||
reg_def XMM11m( SOC, SOE, Op_RegF, 11, xmm11->as_VMReg()->next(12));
|
||||
reg_def XMM11n( SOC, SOE, Op_RegF, 11, xmm11->as_VMReg()->next(13));
|
||||
reg_def XMM11o( SOC, SOE, Op_RegF, 11, xmm11->as_VMReg()->next(14));
|
||||
reg_def XMM11p( SOC, SOE, Op_RegF, 11, xmm11->as_VMReg()->next(15));
|
||||
|
||||
reg_def XMM12 ( SOC, SOE, Op_RegF, 12, xmm12->as_VMReg());
|
||||
reg_def XMM12b( SOC, SOE, Op_RegF, 12, xmm12->as_VMReg()->next(1));
|
||||
reg_def XMM12c( SOC, SOE, Op_RegF, 12, xmm12->as_VMReg()->next(2));
|
||||
reg_def XMM12d( SOC, SOE, Op_RegF, 12, xmm12->as_VMReg()->next(3));
|
||||
reg_def XMM12e( SOC, SOE, Op_RegF, 12, xmm12->as_VMReg()->next(4));
|
||||
reg_def XMM12f( SOC, SOE, Op_RegF, 12, xmm12->as_VMReg()->next(5));
|
||||
reg_def XMM12g( SOC, SOE, Op_RegF, 12, xmm12->as_VMReg()->next(6));
|
||||
reg_def XMM12h( SOC, SOE, Op_RegF, 12, xmm12->as_VMReg()->next(7));
|
||||
reg_def XMM12i( SOC, SOE, Op_RegF, 12, xmm12->as_VMReg()->next(8));
|
||||
reg_def XMM12j( SOC, SOE, Op_RegF, 12, xmm12->as_VMReg()->next(9));
|
||||
reg_def XMM12k( SOC, SOE, Op_RegF, 12, xmm12->as_VMReg()->next(10));
|
||||
reg_def XMM12l( SOC, SOE, Op_RegF, 12, xmm12->as_VMReg()->next(11));
|
||||
reg_def XMM12m( SOC, SOE, Op_RegF, 12, xmm12->as_VMReg()->next(12));
|
||||
reg_def XMM12n( SOC, SOE, Op_RegF, 12, xmm12->as_VMReg()->next(13));
|
||||
reg_def XMM12o( SOC, SOE, Op_RegF, 12, xmm12->as_VMReg()->next(14));
|
||||
reg_def XMM12p( SOC, SOE, Op_RegF, 12, xmm12->as_VMReg()->next(15));
|
||||
|
||||
reg_def XMM13 ( SOC, SOE, Op_RegF, 13, xmm13->as_VMReg());
|
||||
reg_def XMM13b( SOC, SOE, Op_RegF, 13, xmm13->as_VMReg()->next(1));
|
||||
reg_def XMM13c( SOC, SOE, Op_RegF, 13, xmm13->as_VMReg()->next(2));
|
||||
reg_def XMM13d( SOC, SOE, Op_RegF, 13, xmm13->as_VMReg()->next(3));
|
||||
reg_def XMM13e( SOC, SOE, Op_RegF, 13, xmm13->as_VMReg()->next(4));
|
||||
reg_def XMM13f( SOC, SOE, Op_RegF, 13, xmm13->as_VMReg()->next(5));
|
||||
reg_def XMM13g( SOC, SOE, Op_RegF, 13, xmm13->as_VMReg()->next(6));
|
||||
reg_def XMM13h( SOC, SOE, Op_RegF, 13, xmm13->as_VMReg()->next(7));
|
||||
reg_def XMM13i( SOC, SOE, Op_RegF, 13, xmm13->as_VMReg()->next(8));
|
||||
reg_def XMM13j( SOC, SOE, Op_RegF, 13, xmm13->as_VMReg()->next(9));
|
||||
reg_def XMM13k( SOC, SOE, Op_RegF, 13, xmm13->as_VMReg()->next(10));
|
||||
reg_def XMM13l( SOC, SOE, Op_RegF, 13, xmm13->as_VMReg()->next(11));
|
||||
reg_def XMM13m( SOC, SOE, Op_RegF, 13, xmm13->as_VMReg()->next(12));
|
||||
reg_def XMM13n( SOC, SOE, Op_RegF, 13, xmm13->as_VMReg()->next(13));
|
||||
reg_def XMM13o( SOC, SOE, Op_RegF, 13, xmm13->as_VMReg()->next(14));
|
||||
reg_def XMM13p( SOC, SOE, Op_RegF, 13, xmm13->as_VMReg()->next(15));
|
||||
|
||||
reg_def XMM14 ( SOC, SOE, Op_RegF, 14, xmm14->as_VMReg());
|
||||
reg_def XMM14b( SOC, SOE, Op_RegF, 14, xmm14->as_VMReg()->next(1));
|
||||
reg_def XMM14c( SOC, SOE, Op_RegF, 14, xmm14->as_VMReg()->next(2));
|
||||
reg_def XMM14d( SOC, SOE, Op_RegF, 14, xmm14->as_VMReg()->next(3));
|
||||
reg_def XMM14e( SOC, SOE, Op_RegF, 14, xmm14->as_VMReg()->next(4));
|
||||
reg_def XMM14f( SOC, SOE, Op_RegF, 14, xmm14->as_VMReg()->next(5));
|
||||
reg_def XMM14g( SOC, SOE, Op_RegF, 14, xmm14->as_VMReg()->next(6));
|
||||
reg_def XMM14h( SOC, SOE, Op_RegF, 14, xmm14->as_VMReg()->next(7));
|
||||
reg_def XMM14i( SOC, SOE, Op_RegF, 14, xmm14->as_VMReg()->next(8));
|
||||
reg_def XMM14j( SOC, SOE, Op_RegF, 14, xmm14->as_VMReg()->next(9));
|
||||
reg_def XMM14k( SOC, SOE, Op_RegF, 14, xmm14->as_VMReg()->next(10));
|
||||
reg_def XMM14l( SOC, SOE, Op_RegF, 14, xmm14->as_VMReg()->next(11));
|
||||
reg_def XMM14m( SOC, SOE, Op_RegF, 14, xmm14->as_VMReg()->next(12));
|
||||
reg_def XMM14n( SOC, SOE, Op_RegF, 14, xmm14->as_VMReg()->next(13));
|
||||
reg_def XMM14o( SOC, SOE, Op_RegF, 14, xmm14->as_VMReg()->next(14));
|
||||
reg_def XMM14p( SOC, SOE, Op_RegF, 14, xmm14->as_VMReg()->next(15));
|
||||
|
||||
reg_def XMM15 ( SOC, SOE, Op_RegF, 15, xmm15->as_VMReg());
|
||||
reg_def XMM15b( SOC, SOE, Op_RegF, 15, xmm15->as_VMReg()->next(1));
|
||||
reg_def XMM15c( SOC, SOE, Op_RegF, 15, xmm15->as_VMReg()->next(2));
|
||||
reg_def XMM15d( SOC, SOE, Op_RegF, 15, xmm15->as_VMReg()->next(3));
|
||||
reg_def XMM15e( SOC, SOE, Op_RegF, 15, xmm15->as_VMReg()->next(4));
|
||||
reg_def XMM15f( SOC, SOE, Op_RegF, 15, xmm15->as_VMReg()->next(5));
|
||||
reg_def XMM15g( SOC, SOE, Op_RegF, 15, xmm15->as_VMReg()->next(6));
|
||||
reg_def XMM15h( SOC, SOE, Op_RegF, 15, xmm15->as_VMReg()->next(7));
|
||||
reg_def XMM15i( SOC, SOE, Op_RegF, 15, xmm15->as_VMReg()->next(8));
|
||||
reg_def XMM15j( SOC, SOE, Op_RegF, 15, xmm15->as_VMReg()->next(9));
|
||||
reg_def XMM15k( SOC, SOE, Op_RegF, 15, xmm15->as_VMReg()->next(10));
|
||||
reg_def XMM15l( SOC, SOE, Op_RegF, 15, xmm15->as_VMReg()->next(11));
|
||||
reg_def XMM15m( SOC, SOE, Op_RegF, 15, xmm15->as_VMReg()->next(12));
|
||||
reg_def XMM15n( SOC, SOE, Op_RegF, 15, xmm15->as_VMReg()->next(13));
|
||||
reg_def XMM15o( SOC, SOE, Op_RegF, 15, xmm15->as_VMReg()->next(14));
|
||||
reg_def XMM15p( SOC, SOE, Op_RegF, 15, xmm15->as_VMReg()->next(15));
|
||||
|
||||
reg_def XMM16 ( SOC, SOE, Op_RegF, 16, xmm16->as_VMReg());
|
||||
reg_def XMM16b( SOC, SOE, Op_RegF, 16, xmm16->as_VMReg()->next(1));
|
||||
reg_def XMM16c( SOC, SOE, Op_RegF, 16, xmm16->as_VMReg()->next(2));
|
||||
reg_def XMM16d( SOC, SOE, Op_RegF, 16, xmm16->as_VMReg()->next(3));
|
||||
reg_def XMM16e( SOC, SOE, Op_RegF, 16, xmm16->as_VMReg()->next(4));
|
||||
reg_def XMM16f( SOC, SOE, Op_RegF, 16, xmm16->as_VMReg()->next(5));
|
||||
reg_def XMM16g( SOC, SOE, Op_RegF, 16, xmm16->as_VMReg()->next(6));
|
||||
reg_def XMM16h( SOC, SOE, Op_RegF, 16, xmm16->as_VMReg()->next(7));
|
||||
reg_def XMM16i( SOC, SOE, Op_RegF, 16, xmm15->as_VMReg()->next(8));
|
||||
reg_def XMM16j( SOC, SOE, Op_RegF, 16, xmm16->as_VMReg()->next(9));
|
||||
reg_def XMM16k( SOC, SOE, Op_RegF, 16, xmm16->as_VMReg()->next(10));
|
||||
reg_def XMM16l( SOC, SOE, Op_RegF, 16, xmm16->as_VMReg()->next(11));
|
||||
reg_def XMM16m( SOC, SOE, Op_RegF, 16, xmm16->as_VMReg()->next(12));
|
||||
reg_def XMM16n( SOC, SOE, Op_RegF, 16, xmm16->as_VMReg()->next(13));
|
||||
reg_def XMM16o( SOC, SOE, Op_RegF, 16, xmm16->as_VMReg()->next(14));
|
||||
reg_def XMM16p( SOC, SOE, Op_RegF, 16, xmm16->as_VMReg()->next(15));
|
||||
|
||||
reg_def XMM17 ( SOC, SOE, Op_RegF, 17, xmm17->as_VMReg());
|
||||
reg_def XMM17b( SOC, SOE, Op_RegF, 17, xmm17->as_VMReg()->next(1));
|
||||
reg_def XMM17c( SOC, SOE, Op_RegF, 17, xmm17->as_VMReg()->next(2));
|
||||
reg_def XMM17d( SOC, SOE, Op_RegF, 17, xmm17->as_VMReg()->next(3));
|
||||
reg_def XMM17e( SOC, SOE, Op_RegF, 17, xmm17->as_VMReg()->next(4));
|
||||
reg_def XMM17f( SOC, SOE, Op_RegF, 17, xmm17->as_VMReg()->next(5));
|
||||
reg_def XMM17g( SOC, SOE, Op_RegF, 17, xmm17->as_VMReg()->next(6));
|
||||
reg_def XMM17h( SOC, SOE, Op_RegF, 17, xmm17->as_VMReg()->next(7));
|
||||
reg_def XMM17i( SOC, SOE, Op_RegF, 17, xmm17->as_VMReg()->next(8));
|
||||
reg_def XMM17j( SOC, SOE, Op_RegF, 17, xmm17->as_VMReg()->next(9));
|
||||
reg_def XMM17k( SOC, SOE, Op_RegF, 17, xmm17->as_VMReg()->next(10));
|
||||
reg_def XMM17l( SOC, SOE, Op_RegF, 17, xmm17->as_VMReg()->next(11));
|
||||
reg_def XMM17m( SOC, SOE, Op_RegF, 17, xmm17->as_VMReg()->next(12));
|
||||
reg_def XMM17n( SOC, SOE, Op_RegF, 17, xmm17->as_VMReg()->next(13));
|
||||
reg_def XMM17o( SOC, SOE, Op_RegF, 17, xmm17->as_VMReg()->next(14));
|
||||
reg_def XMM17p( SOC, SOE, Op_RegF, 17, xmm17->as_VMReg()->next(15));
|
||||
|
||||
reg_def XMM18 ( SOC, SOE, Op_RegF, 18, xmm18->as_VMReg());
|
||||
reg_def XMM18b( SOC, SOE, Op_RegF, 18, xmm18->as_VMReg()->next(1));
|
||||
reg_def XMM18c( SOC, SOE, Op_RegF, 18, xmm18->as_VMReg()->next(2));
|
||||
reg_def XMM18d( SOC, SOE, Op_RegF, 18, xmm18->as_VMReg()->next(3));
|
||||
reg_def XMM18e( SOC, SOE, Op_RegF, 18, xmm18->as_VMReg()->next(4));
|
||||
reg_def XMM18f( SOC, SOE, Op_RegF, 18, xmm18->as_VMReg()->next(5));
|
||||
reg_def XMM18g( SOC, SOE, Op_RegF, 18, xmm18->as_VMReg()->next(6));
|
||||
reg_def XMM18h( SOC, SOE, Op_RegF, 18, xmm18->as_VMReg()->next(7));
|
||||
reg_def XMM18i( SOC, SOE, Op_RegF, 18, xmm18->as_VMReg()->next(8));
|
||||
reg_def XMM18j( SOC, SOE, Op_RegF, 18, xmm18->as_VMReg()->next(9));
|
||||
reg_def XMM18k( SOC, SOE, Op_RegF, 18, xmm18->as_VMReg()->next(10));
|
||||
reg_def XMM18l( SOC, SOE, Op_RegF, 18, xmm18->as_VMReg()->next(11));
|
||||
reg_def XMM18m( SOC, SOE, Op_RegF, 18, xmm18->as_VMReg()->next(12));
|
||||
reg_def XMM18n( SOC, SOE, Op_RegF, 18, xmm18->as_VMReg()->next(13));
|
||||
reg_def XMM18o( SOC, SOE, Op_RegF, 18, xmm18->as_VMReg()->next(14));
|
||||
reg_def XMM18p( SOC, SOE, Op_RegF, 18, xmm18->as_VMReg()->next(15));
|
||||
|
||||
reg_def XMM19 ( SOC, SOE, Op_RegF, 19, xmm19->as_VMReg());
|
||||
reg_def XMM19b( SOC, SOE, Op_RegF, 19, xmm19->as_VMReg()->next(1));
|
||||
reg_def XMM19c( SOC, SOE, Op_RegF, 19, xmm19->as_VMReg()->next(2));
|
||||
reg_def XMM19d( SOC, SOE, Op_RegF, 19, xmm19->as_VMReg()->next(3));
|
||||
reg_def XMM19e( SOC, SOE, Op_RegF, 19, xmm19->as_VMReg()->next(4));
|
||||
reg_def XMM19f( SOC, SOE, Op_RegF, 19, xmm19->as_VMReg()->next(5));
|
||||
reg_def XMM19g( SOC, SOE, Op_RegF, 19, xmm19->as_VMReg()->next(6));
|
||||
reg_def XMM19h( SOC, SOE, Op_RegF, 19, xmm19->as_VMReg()->next(7));
|
||||
reg_def XMM19i( SOC, SOE, Op_RegF, 19, xmm19->as_VMReg()->next(8));
|
||||
reg_def XMM19j( SOC, SOE, Op_RegF, 19, xmm19->as_VMReg()->next(9));
|
||||
reg_def XMM19k( SOC, SOE, Op_RegF, 19, xmm19->as_VMReg()->next(10));
|
||||
reg_def XMM19l( SOC, SOE, Op_RegF, 19, xmm19->as_VMReg()->next(11));
|
||||
reg_def XMM19m( SOC, SOE, Op_RegF, 19, xmm19->as_VMReg()->next(12));
|
||||
reg_def XMM19n( SOC, SOE, Op_RegF, 19, xmm19->as_VMReg()->next(13));
|
||||
reg_def XMM19o( SOC, SOE, Op_RegF, 19, xmm19->as_VMReg()->next(14));
|
||||
reg_def XMM19p( SOC, SOE, Op_RegF, 19, xmm19->as_VMReg()->next(15));
|
||||
|
||||
reg_def XMM20 ( SOC, SOE, Op_RegF, 20, xmm20->as_VMReg());
|
||||
reg_def XMM20b( SOC, SOE, Op_RegF, 20, xmm20->as_VMReg()->next(1));
|
||||
reg_def XMM20c( SOC, SOE, Op_RegF, 20, xmm20->as_VMReg()->next(2));
|
||||
reg_def XMM20d( SOC, SOE, Op_RegF, 20, xmm20->as_VMReg()->next(3));
|
||||
reg_def XMM20e( SOC, SOE, Op_RegF, 20, xmm20->as_VMReg()->next(4));
|
||||
reg_def XMM20f( SOC, SOE, Op_RegF, 20, xmm20->as_VMReg()->next(5));
|
||||
reg_def XMM20g( SOC, SOE, Op_RegF, 20, xmm20->as_VMReg()->next(6));
|
||||
reg_def XMM20h( SOC, SOE, Op_RegF, 20, xmm20->as_VMReg()->next(7));
|
||||
reg_def XMM20i( SOC, SOE, Op_RegF, 20, xmm20->as_VMReg()->next(8));
|
||||
reg_def XMM20j( SOC, SOE, Op_RegF, 20, xmm20->as_VMReg()->next(9));
|
||||
reg_def XMM20k( SOC, SOE, Op_RegF, 20, xmm20->as_VMReg()->next(10));
|
||||
reg_def XMM20l( SOC, SOE, Op_RegF, 20, xmm20->as_VMReg()->next(11));
|
||||
reg_def XMM20m( SOC, SOE, Op_RegF, 20, xmm20->as_VMReg()->next(12));
|
||||
reg_def XMM20n( SOC, SOE, Op_RegF, 20, xmm20->as_VMReg()->next(13));
|
||||
reg_def XMM20o( SOC, SOE, Op_RegF, 20, xmm20->as_VMReg()->next(14));
|
||||
reg_def XMM20p( SOC, SOE, Op_RegF, 20, xmm20->as_VMReg()->next(15));
|
||||
|
||||
reg_def XMM21 ( SOC, SOE, Op_RegF, 21, xmm21->as_VMReg());
|
||||
reg_def XMM21b( SOC, SOE, Op_RegF, 21, xmm21->as_VMReg()->next(1));
|
||||
reg_def XMM21c( SOC, SOE, Op_RegF, 21, xmm21->as_VMReg()->next(2));
|
||||
reg_def XMM21d( SOC, SOE, Op_RegF, 21, xmm21->as_VMReg()->next(3));
|
||||
reg_def XMM21e( SOC, SOE, Op_RegF, 21, xmm21->as_VMReg()->next(4));
|
||||
reg_def XMM21f( SOC, SOE, Op_RegF, 21, xmm21->as_VMReg()->next(5));
|
||||
reg_def XMM21g( SOC, SOE, Op_RegF, 21, xmm21->as_VMReg()->next(6));
|
||||
reg_def XMM21h( SOC, SOE, Op_RegF, 21, xmm21->as_VMReg()->next(7));
|
||||
reg_def XMM21i( SOC, SOE, Op_RegF, 21, xmm21->as_VMReg()->next(8));
|
||||
reg_def XMM21j( SOC, SOE, Op_RegF, 21, xmm21->as_VMReg()->next(9));
|
||||
reg_def XMM21k( SOC, SOE, Op_RegF, 21, xmm21->as_VMReg()->next(10));
|
||||
reg_def XMM21l( SOC, SOE, Op_RegF, 21, xmm21->as_VMReg()->next(11));
|
||||
reg_def XMM21m( SOC, SOE, Op_RegF, 21, xmm21->as_VMReg()->next(12));
|
||||
reg_def XMM21n( SOC, SOE, Op_RegF, 21, xmm21->as_VMReg()->next(13));
|
||||
reg_def XMM21o( SOC, SOE, Op_RegF, 21, xmm21->as_VMReg()->next(14));
|
||||
reg_def XMM21p( SOC, SOE, Op_RegF, 21, xmm21->as_VMReg()->next(15));
|
||||
|
||||
reg_def XMM22 ( SOC, SOE, Op_RegF, 22, xmm22->as_VMReg());
|
||||
reg_def XMM22b( SOC, SOE, Op_RegF, 22, xmm22->as_VMReg()->next(1));
|
||||
reg_def XMM22c( SOC, SOE, Op_RegF, 22, xmm22->as_VMReg()->next(2));
|
||||
reg_def XMM22d( SOC, SOE, Op_RegF, 22, xmm22->as_VMReg()->next(3));
|
||||
reg_def XMM22e( SOC, SOE, Op_RegF, 22, xmm22->as_VMReg()->next(4));
|
||||
reg_def XMM22f( SOC, SOE, Op_RegF, 22, xmm22->as_VMReg()->next(5));
|
||||
reg_def XMM22g( SOC, SOE, Op_RegF, 22, xmm22->as_VMReg()->next(6));
|
||||
reg_def XMM22h( SOC, SOE, Op_RegF, 22, xmm22->as_VMReg()->next(7));
|
||||
reg_def XMM22i( SOC, SOE, Op_RegF, 22, xmm22->as_VMReg()->next(8));
|
||||
reg_def XMM22j( SOC, SOE, Op_RegF, 22, xmm22->as_VMReg()->next(9));
|
||||
reg_def XMM22k( SOC, SOE, Op_RegF, 22, xmm22->as_VMReg()->next(10));
|
||||
reg_def XMM22l( SOC, SOE, Op_RegF, 22, xmm22->as_VMReg()->next(11));
|
||||
reg_def XMM22m( SOC, SOE, Op_RegF, 22, xmm22->as_VMReg()->next(12));
|
||||
reg_def XMM22n( SOC, SOE, Op_RegF, 22, xmm22->as_VMReg()->next(13));
|
||||
reg_def XMM22o( SOC, SOE, Op_RegF, 22, xmm22->as_VMReg()->next(14));
|
||||
reg_def XMM22p( SOC, SOE, Op_RegF, 22, xmm22->as_VMReg()->next(15));
|
||||
|
||||
reg_def XMM23 ( SOC, SOE, Op_RegF, 23, xmm23->as_VMReg());
|
||||
reg_def XMM23b( SOC, SOE, Op_RegF, 23, xmm23->as_VMReg()->next(1));
|
||||
reg_def XMM23c( SOC, SOE, Op_RegF, 23, xmm23->as_VMReg()->next(2));
|
||||
reg_def XMM23d( SOC, SOE, Op_RegF, 23, xmm23->as_VMReg()->next(3));
|
||||
reg_def XMM23e( SOC, SOE, Op_RegF, 23, xmm23->as_VMReg()->next(4));
|
||||
reg_def XMM23f( SOC, SOE, Op_RegF, 23, xmm23->as_VMReg()->next(5));
|
||||
reg_def XMM23g( SOC, SOE, Op_RegF, 23, xmm23->as_VMReg()->next(6));
|
||||
reg_def XMM23h( SOC, SOE, Op_RegF, 23, xmm23->as_VMReg()->next(7));
|
||||
reg_def XMM23i( SOC, SOE, Op_RegF, 23, xmm23->as_VMReg()->next(8));
|
||||
reg_def XMM23j( SOC, SOE, Op_RegF, 23, xmm23->as_VMReg()->next(9));
|
||||
reg_def XMM23k( SOC, SOE, Op_RegF, 23, xmm23->as_VMReg()->next(10));
|
||||
reg_def XMM23l( SOC, SOE, Op_RegF, 23, xmm23->as_VMReg()->next(11));
|
||||
reg_def XMM23m( SOC, SOE, Op_RegF, 23, xmm23->as_VMReg()->next(12));
|
||||
reg_def XMM23n( SOC, SOE, Op_RegF, 23, xmm23->as_VMReg()->next(13));
|
||||
reg_def XMM23o( SOC, SOE, Op_RegF, 23, xmm23->as_VMReg()->next(14));
|
||||
reg_def XMM23p( SOC, SOE, Op_RegF, 23, xmm23->as_VMReg()->next(15));
|
||||
|
||||
reg_def XMM24 ( SOC, SOE, Op_RegF, 24, xmm24->as_VMReg());
|
||||
reg_def XMM24b( SOC, SOE, Op_RegF, 24, xmm24->as_VMReg()->next(1));
|
||||
reg_def XMM24c( SOC, SOE, Op_RegF, 24, xmm24->as_VMReg()->next(2));
|
||||
reg_def XMM24d( SOC, SOE, Op_RegF, 24, xmm24->as_VMReg()->next(3));
|
||||
reg_def XMM24e( SOC, SOE, Op_RegF, 24, xmm24->as_VMReg()->next(4));
|
||||
reg_def XMM24f( SOC, SOE, Op_RegF, 24, xmm24->as_VMReg()->next(5));
|
||||
reg_def XMM24g( SOC, SOE, Op_RegF, 24, xmm24->as_VMReg()->next(6));
|
||||
reg_def XMM24h( SOC, SOE, Op_RegF, 24, xmm24->as_VMReg()->next(7));
|
||||
reg_def XMM24i( SOC, SOE, Op_RegF, 24, xmm24->as_VMReg()->next(8));
|
||||
reg_def XMM24j( SOC, SOE, Op_RegF, 24, xmm24->as_VMReg()->next(9));
|
||||
reg_def XMM24k( SOC, SOE, Op_RegF, 24, xmm24->as_VMReg()->next(10));
|
||||
reg_def XMM24l( SOC, SOE, Op_RegF, 24, xmm24->as_VMReg()->next(11));
|
||||
reg_def XMM24m( SOC, SOE, Op_RegF, 24, xmm24->as_VMReg()->next(12));
|
||||
reg_def XMM24n( SOC, SOE, Op_RegF, 24, xmm24->as_VMReg()->next(13));
|
||||
reg_def XMM24o( SOC, SOE, Op_RegF, 24, xmm24->as_VMReg()->next(14));
|
||||
reg_def XMM24p( SOC, SOE, Op_RegF, 24, xmm24->as_VMReg()->next(15));
|
||||
|
||||
reg_def XMM25 ( SOC, SOE, Op_RegF, 25, xmm25->as_VMReg());
|
||||
reg_def XMM25b( SOC, SOE, Op_RegF, 25, xmm25->as_VMReg()->next(1));
|
||||
reg_def XMM25c( SOC, SOE, Op_RegF, 25, xmm25->as_VMReg()->next(2));
|
||||
reg_def XMM25d( SOC, SOE, Op_RegF, 25, xmm25->as_VMReg()->next(3));
|
||||
reg_def XMM25e( SOC, SOE, Op_RegF, 25, xmm25->as_VMReg()->next(4));
|
||||
reg_def XMM25f( SOC, SOE, Op_RegF, 25, xmm25->as_VMReg()->next(5));
|
||||
reg_def XMM25g( SOC, SOE, Op_RegF, 25, xmm25->as_VMReg()->next(6));
|
||||
reg_def XMM25h( SOC, SOE, Op_RegF, 25, xmm25->as_VMReg()->next(7));
|
||||
reg_def XMM25i( SOC, SOE, Op_RegF, 25, xmm25->as_VMReg()->next(8));
|
||||
reg_def XMM25j( SOC, SOE, Op_RegF, 25, xmm25->as_VMReg()->next(9));
|
||||
reg_def XMM25k( SOC, SOE, Op_RegF, 25, xmm25->as_VMReg()->next(10));
|
||||
reg_def XMM25l( SOC, SOE, Op_RegF, 25, xmm25->as_VMReg()->next(11));
|
||||
reg_def XMM25m( SOC, SOE, Op_RegF, 25, xmm25->as_VMReg()->next(12));
|
||||
reg_def XMM25n( SOC, SOE, Op_RegF, 25, xmm25->as_VMReg()->next(13));
|
||||
reg_def XMM25o( SOC, SOE, Op_RegF, 25, xmm25->as_VMReg()->next(14));
|
||||
reg_def XMM25p( SOC, SOE, Op_RegF, 25, xmm25->as_VMReg()->next(15));
|
||||
|
||||
reg_def XMM26 ( SOC, SOE, Op_RegF, 26, xmm26->as_VMReg());
|
||||
reg_def XMM26b( SOC, SOE, Op_RegF, 26, xmm26->as_VMReg()->next(1));
|
||||
reg_def XMM26c( SOC, SOE, Op_RegF, 26, xmm26->as_VMReg()->next(2));
|
||||
reg_def XMM26d( SOC, SOE, Op_RegF, 26, xmm26->as_VMReg()->next(3));
|
||||
reg_def XMM26e( SOC, SOE, Op_RegF, 26, xmm26->as_VMReg()->next(4));
|
||||
reg_def XMM26f( SOC, SOE, Op_RegF, 26, xmm26->as_VMReg()->next(5));
|
||||
reg_def XMM26g( SOC, SOE, Op_RegF, 26, xmm26->as_VMReg()->next(6));
|
||||
reg_def XMM26h( SOC, SOE, Op_RegF, 26, xmm26->as_VMReg()->next(7));
|
||||
reg_def XMM26i( SOC, SOE, Op_RegF, 26, xmm26->as_VMReg()->next(8));
|
||||
reg_def XMM26j( SOC, SOE, Op_RegF, 26, xmm26->as_VMReg()->next(9));
|
||||
reg_def XMM26k( SOC, SOE, Op_RegF, 26, xmm26->as_VMReg()->next(10));
|
||||
reg_def XMM26l( SOC, SOE, Op_RegF, 26, xmm26->as_VMReg()->next(11));
|
||||
reg_def XMM26m( SOC, SOE, Op_RegF, 26, xmm26->as_VMReg()->next(12));
|
||||
reg_def XMM26n( SOC, SOE, Op_RegF, 26, xmm26->as_VMReg()->next(13));
|
||||
reg_def XMM26o( SOC, SOE, Op_RegF, 26, xmm26->as_VMReg()->next(14));
|
||||
reg_def XMM26p( SOC, SOE, Op_RegF, 26, xmm26->as_VMReg()->next(15));
|
||||
|
||||
reg_def XMM27g( SOC, SOE, Op_RegF, 27, xmm27->as_VMReg()->next(1));
|
||||
reg_def XMM27c( SOC, SOE, Op_RegF, 27, xmm27->as_VMReg()->next(2));
|
||||
reg_def XMM27d( SOC, SOE, Op_RegF, 27, xmm27->as_VMReg()->next(3));
|
||||
reg_def XMM27e( SOC, SOE, Op_RegF, 27, xmm27->as_VMReg()->next(4));
|
||||
reg_def XMM27f( SOC, SOE, Op_RegF, 27, xmm27->as_VMReg()->next(5));
|
||||
reg_def XMM27g( SOC, SOE, Op_RegF, 27, xmm27->as_VMReg()->next(6));
|
||||
reg_def XMM27h( SOC, SOE, Op_RegF, 27, xmm27->as_VMReg()->next(7));
|
||||
reg_def XMM27i( SOC, SOE, Op_RegF, 27, xmm27->as_VMReg()->next(8));
|
||||
reg_def XMM27j( SOC, SOE, Op_RegF, 27, xmm27->as_VMReg()->next(9));
|
||||
reg_def XMM27k( SOC, SOE, Op_RegF, 27, xmm27->as_VMReg()->next(10));
|
||||
reg_def XMM27l( SOC, SOE, Op_RegF, 27, xmm27->as_VMReg()->next(11));
|
||||
reg_def XMM27m( SOC, SOE, Op_RegF, 27, xmm27->as_VMReg()->next(12));
|
||||
reg_def XMM27n( SOC, SOE, Op_RegF, 27, xmm27->as_VMReg()->next(13));
|
||||
reg_def XMM27o( SOC, SOE, Op_RegF, 27, xmm27->as_VMReg()->next(14));
|
||||
reg_def XMM27p( SOC, SOE, Op_RegF, 27, xmm27->as_VMReg()->next(15));
|
||||
|
||||
reg_def XMM28 ( SOC, SOE, Op_RegF, 28, xmm28->as_VMReg());
|
||||
reg_def XMM28b( SOC, SOE, Op_RegF, 28, xmm28->as_VMReg()->next(1));
|
||||
reg_def XMM28c( SOC, SOE, Op_RegF, 28, xmm28->as_VMReg()->next(2));
|
||||
reg_def XMM28d( SOC, SOE, Op_RegF, 28, xmm28->as_VMReg()->next(3));
|
||||
reg_def XMM28e( SOC, SOE, Op_RegF, 28, xmm28->as_VMReg()->next(4));
|
||||
reg_def XMM28f( SOC, SOE, Op_RegF, 28, xmm28->as_VMReg()->next(5));
|
||||
reg_def XMM28g( SOC, SOE, Op_RegF, 28, xmm28->as_VMReg()->next(6));
|
||||
reg_def XMM28h( SOC, SOE, Op_RegF, 28, xmm28->as_VMReg()->next(7));
|
||||
reg_def XMM28i( SOC, SOE, Op_RegF, 28, xmm28->as_VMReg()->next(8));
|
||||
reg_def XMM28j( SOC, SOE, Op_RegF, 28, xmm28->as_VMReg()->next(9));
|
||||
reg_def XMM28k( SOC, SOE, Op_RegF, 28, xmm28->as_VMReg()->next(10));
|
||||
reg_def XMM28l( SOC, SOE, Op_RegF, 28, xmm28->as_VMReg()->next(11));
|
||||
reg_def XMM28m( SOC, SOE, Op_RegF, 28, xmm28->as_VMReg()->next(12));
|
||||
reg_def XMM28n( SOC, SOE, Op_RegF, 28, xmm28->as_VMReg()->next(13));
|
||||
reg_def XMM28o( SOC, SOE, Op_RegF, 28, xmm28->as_VMReg()->next(14));
|
||||
reg_def XMM28p( SOC, SOE, Op_RegF, 28, xmm28->as_VMReg()->next(15));
|
||||
|
||||
reg_def XMM29 ( SOC, SOE, Op_RegF, 29, xmm29->as_VMReg());
|
||||
reg_def XMM29b( SOC, SOE, Op_RegF, 29, xmm29->as_VMReg()->next(1));
|
||||
reg_def XMM29c( SOC, SOE, Op_RegF, 29, xmm29->as_VMReg()->next(2));
|
||||
reg_def XMM29d( SOC, SOE, Op_RegF, 29, xmm29->as_VMReg()->next(3));
|
||||
reg_def XMM29e( SOC, SOE, Op_RegF, 29, xmm29->as_VMReg()->next(4));
|
||||
reg_def XMM29f( SOC, SOE, Op_RegF, 29, xmm29->as_VMReg()->next(5));
|
||||
reg_def XMM29g( SOC, SOE, Op_RegF, 29, xmm29->as_VMReg()->next(6));
|
||||
reg_def XMM29h( SOC, SOE, Op_RegF, 29, xmm29->as_VMReg()->next(7));
|
||||
reg_def XMM29i( SOC, SOE, Op_RegF, 29, xmm29->as_VMReg()->next(8));
|
||||
reg_def XMM29j( SOC, SOE, Op_RegF, 29, xmm29->as_VMReg()->next(9));
|
||||
reg_def XMM29k( SOC, SOE, Op_RegF, 29, xmm29->as_VMReg()->next(10));
|
||||
reg_def XMM29l( SOC, SOE, Op_RegF, 29, xmm29->as_VMReg()->next(11));
|
||||
reg_def XMM29m( SOC, SOE, Op_RegF, 29, xmm29->as_VMReg()->next(12));
|
||||
reg_def XMM29n( SOC, SOE, Op_RegF, 29, xmm29->as_VMReg()->next(13));
|
||||
reg_def XMM29o( SOC, SOE, Op_RegF, 29, xmm29->as_VMReg()->next(14));
|
||||
reg_def XMM29p( SOC, SOE, Op_RegF, 29, xmm29->as_VMReg()->next(15));
|
||||
|
||||
reg_def XMM30 ( SOC, SOE, Op_RegF, 30, xmm30->as_VMReg());
|
||||
reg_def XMM30b( SOC, SOE, Op_RegF, 30, xmm30->as_VMReg()->next(1));
|
||||
reg_def XMM30c( SOC, SOE, Op_RegF, 30, xmm30->as_VMReg()->next(2));
|
||||
reg_def XMM30d( SOC, SOE, Op_RegF, 30, xmm30->as_VMReg()->next(3));
|
||||
reg_def XMM30e( SOC, SOE, Op_RegF, 30, xmm30->as_VMReg()->next(4));
|
||||
reg_def XMM30f( SOC, SOE, Op_RegF, 30, xmm30->as_VMReg()->next(5));
|
||||
reg_def XMM30g( SOC, SOE, Op_RegF, 30, xmm30->as_VMReg()->next(6));
|
||||
reg_def XMM30h( SOC, SOE, Op_RegF, 30, xmm30->as_VMReg()->next(7));
|
||||
reg_def XMM30i( SOC, SOE, Op_RegF, 30, xmm30->as_VMReg()->next(8));
|
||||
reg_def XMM30j( SOC, SOE, Op_RegF, 30, xmm30->as_VMReg()->next(9));
|
||||
reg_def XMM30k( SOC, SOE, Op_RegF, 30, xmm30->as_VMReg()->next(10));
|
||||
reg_def XMM30l( SOC, SOE, Op_RegF, 30, xmm30->as_VMReg()->next(11));
|
||||
reg_def XMM30m( SOC, SOE, Op_RegF, 30, xmm30->as_VMReg()->next(12));
|
||||
reg_def XMM30n( SOC, SOE, Op_RegF, 30, xmm30->as_VMReg()->next(13));
|
||||
reg_def XMM30o( SOC, SOE, Op_RegF, 30, xmm30->as_VMReg()->next(14));
|
||||
reg_def XMM30p( SOC, SOE, Op_RegF, 30, xmm30->as_VMReg()->next(15));
|
||||
|
||||
reg_def XMM31 ( SOC, SOE, Op_RegF, 31, xmm31->as_VMReg());
|
||||
reg_def XMM31b( SOC, SOE, Op_RegF, 31, xmm31->as_VMReg()->next(1));
|
||||
reg_def XMM31c( SOC, SOE, Op_RegF, 31, xmm31->as_VMReg()->next(2));
|
||||
reg_def XMM31d( SOC, SOE, Op_RegF, 31, xmm31->as_VMReg()->next(3));
|
||||
reg_def XMM31e( SOC, SOE, Op_RegF, 31, xmm31->as_VMReg()->next(4));
|
||||
reg_def XMM31f( SOC, SOE, Op_RegF, 31, xmm31->as_VMReg()->next(5));
|
||||
reg_def XMM31g( SOC, SOE, Op_RegF, 31, xmm31->as_VMReg()->next(6));
|
||||
reg_def XMM31h( SOC, SOE, Op_RegF, 31, xmm31>-as_VMReg()->next(7));
|
||||
reg_def XMM31i( SOC, SOE, Op_RegF, 31, xmm31->as_VMReg()->next(8));
|
||||
reg_def XMM31j( SOC, SOE, Op_RegF, 31, xmm31->as_VMReg()->next(9));
|
||||
reg_def XMM31k( SOC, SOE, Op_RegF, 31, xmm31->as_VMReg()->next(10));
|
||||
reg_def XMM31l( SOC, SOE, Op_RegF, 31, xmm31->as_VMReg()->next(11));
|
||||
reg_def XMM31m( SOC, SOE, Op_RegF, 31, xmm31->as_VMReg()->next(12));
|
||||
reg_def XMM31n( SOC, SOE, Op_RegF, 31, xmm31->as_VMReg()->next(13));
|
||||
reg_def XMM31o( SOC, SOE, Op_RegF, 31, xmm31->as_VMReg()->next(14));
|
||||
reg_def XMM31p( SOC, SOE, Op_RegF, 31, xmm31->as_VMReg()->next(15));
|
||||
|
||||
#else // _WIN64
|
||||
|
||||
reg_def XMM6 ( SOC, SOC, Op_RegF, 6, xmm6->as_VMReg());
|
||||
reg_def XMM6b( SOC, SOC, Op_RegF, 6, xmm6->as_VMReg()->next(1));
|
||||
reg_def XMM6c( SOC, SOC, Op_RegF, 6, xmm6->as_VMReg()->next(2));
|
||||
@ -1067,8 +622,6 @@ reg_def XMM31p( SOC, SOC, Op_RegF, 31, xmm31->as_VMReg()->next(15));
|
||||
|
||||
#endif // _LP64
|
||||
|
||||
#endif // _WIN64
|
||||
|
||||
#ifdef _LP64
|
||||
reg_def RFLAGS(SOC, SOC, 0, 16, VMRegImpl::Bad());
|
||||
#else
|
||||
@ -3113,6 +2666,30 @@ instruct onspinwait() %{
|
||||
ins_pipe(pipe_slow);
|
||||
%}
|
||||
|
||||
// a * b + c
|
||||
instruct fmaD_reg(regD a, regD b, regD c) %{
|
||||
predicate(UseFMA);
|
||||
match(Set c (FmaD c (Binary a b)));
|
||||
format %{ "fmasd $a,$b,$c\t# $c = $a * $b + $c" %}
|
||||
ins_cost(150);
|
||||
ins_encode %{
|
||||
__ fmad($c$$XMMRegister, $a$$XMMRegister, $b$$XMMRegister, $c$$XMMRegister);
|
||||
%}
|
||||
ins_pipe( pipe_slow );
|
||||
%}
|
||||
|
||||
// a * b + c
|
||||
instruct fmaF_reg(regF a, regF b, regF c) %{
|
||||
predicate(UseFMA);
|
||||
match(Set c (FmaF c (Binary a b)));
|
||||
format %{ "fmass $a,$b,$c\t# $c = $a * $b + $c" %}
|
||||
ins_cost(150);
|
||||
ins_encode %{
|
||||
__ fmaf($c$$XMMRegister, $a$$XMMRegister, $b$$XMMRegister, $c$$XMMRegister);
|
||||
%}
|
||||
ins_pipe( pipe_slow );
|
||||
%}
|
||||
|
||||
// ====================VECTOR INSTRUCTIONS=====================================
|
||||
|
||||
// Load vectors (4 bytes long)
|
||||
|
@ -104,14 +104,14 @@ reg_def FPR7H( SOC, SOC, Op_RegF, 7, as_FloatRegister(6)->as_VMReg()->next());
|
||||
//
|
||||
// Empty fill registers, which are never used, but supply alignment to xmm regs
|
||||
//
|
||||
reg_def FILL0( SOC, SOC, Op_RegF, 7, as_FloatRegister(6)->as_VMReg()->next(2));
|
||||
reg_def FILL1( SOC, SOC, Op_RegF, 7, as_FloatRegister(6)->as_VMReg()->next(3));
|
||||
reg_def FILL2( SOC, SOC, Op_RegF, 7, as_FloatRegister(6)->as_VMReg()->next(4));
|
||||
reg_def FILL3( SOC, SOC, Op_RegF, 7, as_FloatRegister(6)->as_VMReg()->next(5));
|
||||
reg_def FILL4( SOC, SOC, Op_RegF, 7, as_FloatRegister(6)->as_VMReg()->next(6));
|
||||
reg_def FILL5( SOC, SOC, Op_RegF, 7, as_FloatRegister(6)->as_VMReg()->next(7));
|
||||
reg_def FILL6( SOC, SOC, Op_RegF, 7, as_FloatRegister(6)->as_VMReg()->next(8));
|
||||
reg_def FILL7( SOC, SOC, Op_RegF, 7, as_FloatRegister(6)->as_VMReg()->next(9));
|
||||
reg_def FILL0( SOC, SOC, Op_RegF, 8, VMRegImpl::Bad());
|
||||
reg_def FILL1( SOC, SOC, Op_RegF, 9, VMRegImpl::Bad());
|
||||
reg_def FILL2( SOC, SOC, Op_RegF, 10, VMRegImpl::Bad());
|
||||
reg_def FILL3( SOC, SOC, Op_RegF, 11, VMRegImpl::Bad());
|
||||
reg_def FILL4( SOC, SOC, Op_RegF, 12, VMRegImpl::Bad());
|
||||
reg_def FILL5( SOC, SOC, Op_RegF, 13, VMRegImpl::Bad());
|
||||
reg_def FILL6( SOC, SOC, Op_RegF, 14, VMRegImpl::Bad());
|
||||
reg_def FILL7( SOC, SOC, Op_RegF, 15, VMRegImpl::Bad());
|
||||
|
||||
// Specify priority of register selection within phases of register
|
||||
// allocation. Highest priority is first. A useful heuristic is to
|
||||
|
@ -205,7 +205,8 @@ public class AMD64 extends Architecture {
|
||||
AVX512CD,
|
||||
AVX512BW,
|
||||
AVX512VL,
|
||||
SHA
|
||||
SHA,
|
||||
FMA
|
||||
}
|
||||
|
||||
private final EnumSet<CPUFeature> features;
|
||||
|
@ -124,6 +124,9 @@ public class AMD64HotSpotJVMCIBackendFactory implements HotSpotJVMCIBackendFacto
|
||||
if ((config.vmVersionFeatures & config.amd64SHA) != 0) {
|
||||
features.add(AMD64.CPUFeature.SHA);
|
||||
}
|
||||
if ((config.vmVersionFeatures & config.amd64FMA) != 0) {
|
||||
features.add(AMD64.CPUFeature.FMA);
|
||||
}
|
||||
return features;
|
||||
}
|
||||
|
||||
|
@ -78,4 +78,5 @@ class AMD64HotSpotVMConfig extends HotSpotVMConfigAccess {
|
||||
final long amd64AVX512BW = getConstant("VM_Version::CPU_AVX512BW", Long.class);
|
||||
final long amd64AVX512VL = getConstant("VM_Version::CPU_AVX512VL", Long.class);
|
||||
final long amd64SHA = getConstant("VM_Version::CPU_SHA", Long.class);
|
||||
final long amd64FMA = getConstant("VM_Version::CPU_FMA", Long.class);
|
||||
}
|
||||
|
@ -26,8 +26,7 @@ package jdk.vm.ci.hotspot;
|
||||
import static jdk.vm.ci.common.InitTimer.timer;
|
||||
import static jdk.vm.ci.hotspot.HotSpotJVMCIRuntime.runtime;
|
||||
|
||||
import java.lang.reflect.Constructor;
|
||||
import java.lang.reflect.Method;
|
||||
import java.lang.reflect.Executable;
|
||||
|
||||
import jdk.vm.ci.code.BytecodeFrame;
|
||||
import jdk.vm.ci.code.InstalledCode;
|
||||
@ -385,10 +384,9 @@ final class CompilerToVM {
|
||||
native boolean hasFinalizableSubclass(HotSpotResolvedObjectTypeImpl type);
|
||||
|
||||
/**
|
||||
* Gets the method corresponding to {@code holder} and slot number {@code slot} (i.e.
|
||||
* {@link Method#slot} or {@link Constructor#slot}).
|
||||
* Gets the method corresponding to {@code executable}.
|
||||
*/
|
||||
native HotSpotResolvedJavaMethodImpl getResolvedJavaMethodAtSlot(Class<?> holder, int slot);
|
||||
native HotSpotResolvedJavaMethodImpl asResolvedJavaMethod(Executable executable);
|
||||
|
||||
/**
|
||||
* Gets the maximum absolute offset of a PC relative call to {@code address} from any position
|
||||
@ -616,4 +614,9 @@ final class CompilerToVM {
|
||||
*/
|
||||
native int interpreterFrameSize(BytecodeFrame frame);
|
||||
|
||||
/**
|
||||
* Invokes non-public method {@code java.lang.invoke.LambdaForm.compileToBytecode()} on
|
||||
* {@code lambdaForm} (which must be a {@code java.lang.invoke.LambdaForm} instance).
|
||||
*/
|
||||
native void compileToBytecode(Object lambdaForm);
|
||||
}
|
||||
|
@ -22,7 +22,7 @@
|
||||
*/
|
||||
package jdk.vm.ci.hotspot;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.util.Map;
|
||||
|
||||
import jdk.vm.ci.code.BailoutException;
|
||||
import jdk.vm.ci.code.BytecodeFrame;
|
||||
@ -56,16 +56,11 @@ public class HotSpotCodeCacheProvider implements CodeCacheProvider {
|
||||
@Override
|
||||
public String getMarkName(Mark mark) {
|
||||
int markId = (int) mark.id;
|
||||
Field[] fields = runtime.getConfig().getClass().getDeclaredFields();
|
||||
for (Field f : fields) {
|
||||
if (f.getName().startsWith("MARKID_")) {
|
||||
f.setAccessible(true);
|
||||
try {
|
||||
if (f.getInt(runtime.getConfig()) == markId) {
|
||||
return f.getName();
|
||||
}
|
||||
} catch (Exception e) {
|
||||
}
|
||||
HotSpotVMConfigStore store = runtime.getConfigStore();
|
||||
for (Map.Entry<String, Long> e : store.getConstants().entrySet()) {
|
||||
String name = e.getKey();
|
||||
if (name.startsWith("MARKID_") && e.getValue() == markId) {
|
||||
return name;
|
||||
}
|
||||
}
|
||||
return CodeCacheProvider.super.getMarkName(mark);
|
||||
@ -76,17 +71,13 @@ public class HotSpotCodeCacheProvider implements CodeCacheProvider {
|
||||
*/
|
||||
@Override
|
||||
public String getTargetName(Call call) {
|
||||
Field[] fields = runtime.getConfig().getClass().getDeclaredFields();
|
||||
for (Field f : fields) {
|
||||
if (f.getName().endsWith("Stub")) {
|
||||
f.setAccessible(true);
|
||||
Object address;
|
||||
try {
|
||||
address = f.get(runtime.getConfig());
|
||||
if (address.equals(call.target)) {
|
||||
return f.getName() + ":0x" + Long.toHexString((Long) address);
|
||||
}
|
||||
} catch (IllegalArgumentException | IllegalAccessException e) {
|
||||
if (call.target instanceof HotSpotForeignCallTarget) {
|
||||
long address = ((HotSpotForeignCallTarget) call.target).address;
|
||||
HotSpotVMConfigStore store = runtime.getConfigStore();
|
||||
for (Map.Entry<String, VMField> e : store.getFields().entrySet()) {
|
||||
VMField field = e.getValue();
|
||||
if (field.isStatic() && field.value != null && field.value == address) {
|
||||
return e.getValue() + ":0x" + Long.toHexString(address);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -28,11 +28,10 @@ import static jdk.vm.ci.hotspot.HotSpotResolvedObjectTypeImpl.fromObjectClass;
|
||||
import static jdk.vm.ci.hotspot.UnsafeAccess.UNSAFE;
|
||||
|
||||
import java.lang.reflect.Array;
|
||||
import java.lang.reflect.Constructor;
|
||||
import java.lang.reflect.Executable;
|
||||
import java.lang.reflect.Field;
|
||||
import java.lang.reflect.Method;
|
||||
import java.lang.reflect.Modifier;
|
||||
import java.util.Objects;
|
||||
|
||||
import jdk.vm.ci.code.CodeUtil;
|
||||
import jdk.vm.ci.code.TargetDescription;
|
||||
@ -78,35 +77,8 @@ public class HotSpotMetaAccessProvider implements MetaAccessProvider {
|
||||
return new HotSpotSignature(runtime, signature);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@link Field} object of {@link Method#slot}.
|
||||
*/
|
||||
private Field reflectionMethodSlot = getReflectionSlotField(Method.class);
|
||||
|
||||
/**
|
||||
* {@link Field} object of {@link Constructor#slot}.
|
||||
*/
|
||||
private Field reflectionConstructorSlot = getReflectionSlotField(Constructor.class);
|
||||
|
||||
private static Field getReflectionSlotField(Class<?> reflectionClass) {
|
||||
try {
|
||||
Field field = reflectionClass.getDeclaredField("slot");
|
||||
field.setAccessible(true);
|
||||
return field;
|
||||
} catch (NoSuchFieldException | SecurityException e) {
|
||||
throw new JVMCIError(e);
|
||||
}
|
||||
}
|
||||
|
||||
public ResolvedJavaMethod lookupJavaMethod(Executable reflectionMethod) {
|
||||
try {
|
||||
Class<?> holder = reflectionMethod.getDeclaringClass();
|
||||
Field slotField = reflectionMethod instanceof Constructor ? reflectionConstructorSlot : reflectionMethodSlot;
|
||||
final int slot = slotField.getInt(reflectionMethod);
|
||||
return runtime.getCompilerToVM().getResolvedJavaMethodAtSlot(holder, slot);
|
||||
} catch (IllegalArgumentException | IllegalAccessException e) {
|
||||
throw new JVMCIError(e);
|
||||
}
|
||||
return runtime.getCompilerToVM().asResolvedJavaMethod(Objects.requireNonNull(reflectionMethod));
|
||||
}
|
||||
|
||||
public ResolvedJavaField lookupJavaField(Field reflectionField) {
|
||||
|
@ -24,16 +24,17 @@ package jdk.vm.ci.hotspot;
|
||||
|
||||
import static jdk.vm.ci.hotspot.CompilerToVM.compilerToVM;
|
||||
import static jdk.vm.ci.hotspot.HotSpotJVMCIRuntime.runtime;
|
||||
import static jdk.vm.ci.hotspot.HotSpotResolvedObjectTypeImpl.fromObjectClass;
|
||||
|
||||
import java.lang.invoke.MethodHandle;
|
||||
import java.util.Objects;
|
||||
|
||||
import jdk.vm.ci.common.JVMCIError;
|
||||
import jdk.vm.ci.meta.ConstantReflectionProvider;
|
||||
import jdk.vm.ci.meta.JavaConstant;
|
||||
import jdk.vm.ci.meta.JavaKind;
|
||||
import jdk.vm.ci.meta.MethodHandleAccessProvider;
|
||||
import jdk.vm.ci.meta.ResolvedJavaField;
|
||||
import jdk.vm.ci.meta.ResolvedJavaMethod;
|
||||
import jdk.vm.ci.meta.ResolvedJavaType;
|
||||
import jdk.vm.ci.meta.Signature;
|
||||
|
||||
public class HotSpotMethodHandleAccessProvider implements MethodHandleAccessProvider {
|
||||
|
||||
@ -48,88 +49,46 @@ public class HotSpotMethodHandleAccessProvider implements MethodHandleAccessProv
|
||||
* possible after the {@link HotSpotJVMCIRuntime} is fully initialized.
|
||||
*/
|
||||
static class LazyInitialization {
|
||||
static final ResolvedJavaType lambdaFormType;
|
||||
static final ResolvedJavaField methodHandleFormField;
|
||||
static final ResolvedJavaField lambdaFormVmentryField;
|
||||
static final ResolvedJavaMethod lambdaFormCompileToBytecodeMethod;
|
||||
static final HotSpotResolvedJavaField memberNameVmtargetField;
|
||||
|
||||
static final ResolvedJavaType CLASS = fromObjectClass(LazyInitialization.class);
|
||||
|
||||
/**
|
||||
* Search for an instance field with the given name in a class.
|
||||
*
|
||||
* @param className name of the class to search in
|
||||
* @param declaringType the type declaring the field
|
||||
* @param fieldName name of the field to be searched
|
||||
* @param fieldType resolved Java type of the field
|
||||
* @return resolved Java field
|
||||
* @throws ClassNotFoundException
|
||||
* @throws NoSuchFieldError
|
||||
*/
|
||||
private static ResolvedJavaField findFieldInClass(String className, String fieldName, ResolvedJavaType fieldType)
|
||||
throws ClassNotFoundException {
|
||||
Class<?> clazz = Class.forName(className);
|
||||
ResolvedJavaType type = runtime().fromClass(clazz);
|
||||
ResolvedJavaField[] fields = type.getInstanceFields(false);
|
||||
private static ResolvedJavaField findFieldInClass(ResolvedJavaType declaringType, String fieldName, ResolvedJavaType fieldType) {
|
||||
ResolvedJavaField[] fields = declaringType.getInstanceFields(false);
|
||||
for (ResolvedJavaField field : fields) {
|
||||
if (field.getName().equals(fieldName) && field.getType().equals(fieldType)) {
|
||||
return field;
|
||||
}
|
||||
}
|
||||
throw new NoSuchFieldError(fieldType.getName() + " " + className + "." + fieldName);
|
||||
throw new NoSuchFieldError(fieldType.getName() + " " + declaringType + "." + fieldName);
|
||||
}
|
||||
|
||||
private static ResolvedJavaMethod findMethodInClass(String className, String methodName,
|
||||
ResolvedJavaType resultType, ResolvedJavaType[] parameterTypes) throws ClassNotFoundException {
|
||||
Class<?> clazz = Class.forName(className);
|
||||
HotSpotResolvedObjectTypeImpl type = fromObjectClass(clazz);
|
||||
ResolvedJavaMethod result = null;
|
||||
for (ResolvedJavaMethod method : type.getDeclaredMethods()) {
|
||||
if (method.getName().equals(methodName) && signatureMatches(method, resultType, parameterTypes)) {
|
||||
result = method;
|
||||
}
|
||||
}
|
||||
if (result == null) {
|
||||
StringBuilder sig = new StringBuilder("(");
|
||||
for (ResolvedJavaType t : parameterTypes) {
|
||||
sig.append(t.getName()).append(",");
|
||||
}
|
||||
if (sig.length() > 1) {
|
||||
sig.replace(sig.length() - 1, sig.length(), ")");
|
||||
} else {
|
||||
sig.append(')');
|
||||
}
|
||||
throw new NoSuchMethodError(resultType.getName() + " " + className + "." + methodName + sig.toString());
|
||||
}
|
||||
return result;
|
||||
private static ResolvedJavaType resolveType(Class<?> c) {
|
||||
return runtime().fromClass(c);
|
||||
}
|
||||
|
||||
private static boolean signatureMatches(ResolvedJavaMethod m, ResolvedJavaType resultType,
|
||||
ResolvedJavaType[] parameterTypes) {
|
||||
Signature s = m.getSignature();
|
||||
if (!s.getReturnType(CLASS).equals(resultType)) {
|
||||
return false;
|
||||
}
|
||||
if (s.getParameterCount(false) != parameterTypes.length) {
|
||||
return false;
|
||||
}
|
||||
for (int i = 0; i < s.getParameterCount(false); ++i) {
|
||||
if (!s.getParameterType(i, CLASS).equals(parameterTypes[i])) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
private static ResolvedJavaType resolveType(String className) throws ClassNotFoundException {
|
||||
return resolveType(Class.forName(className));
|
||||
}
|
||||
|
||||
static {
|
||||
try {
|
||||
methodHandleFormField = findFieldInClass("java.lang.invoke.MethodHandle", "form",
|
||||
fromObjectClass(Class.forName("java.lang.invoke.LambdaForm")));
|
||||
lambdaFormVmentryField = findFieldInClass("java.lang.invoke.LambdaForm", "vmentry",
|
||||
fromObjectClass(Class.forName("java.lang.invoke.MemberName")));
|
||||
lambdaFormCompileToBytecodeMethod = findMethodInClass("java.lang.invoke.LambdaForm", "compileToBytecode",
|
||||
new HotSpotResolvedPrimitiveType(JavaKind.Void), new ResolvedJavaType[]{});
|
||||
memberNameVmtargetField = (HotSpotResolvedJavaField) findFieldInClass("java.lang.invoke.MemberName", "vmtarget",
|
||||
new HotSpotResolvedPrimitiveType(JavaKind.Long));
|
||||
ResolvedJavaType methodHandleType = resolveType(MethodHandle.class);
|
||||
ResolvedJavaType memberNameType = resolveType("java.lang.invoke.MemberName");
|
||||
lambdaFormType = resolveType("java.lang.invoke.LambdaForm");
|
||||
methodHandleFormField = findFieldInClass(methodHandleType, "form", lambdaFormType);
|
||||
lambdaFormVmentryField = findFieldInClass(lambdaFormType, "vmentry", memberNameType);
|
||||
memberNameVmtargetField = (HotSpotResolvedJavaField) findFieldInClass(memberNameType, "vmtarget", resolveType(long.class));
|
||||
} catch (Throwable ex) {
|
||||
throw new JVMCIError(ex);
|
||||
}
|
||||
@ -173,12 +132,13 @@ public class HotSpotMethodHandleAccessProvider implements MethodHandleAccessProv
|
||||
return null;
|
||||
}
|
||||
|
||||
if (forceBytecodeGeneration) {
|
||||
/* Invoke non-public method: MemberName LambdaForm.compileToBytecode() */
|
||||
LazyInitialization.lambdaFormCompileToBytecodeMethod.invoke(lambdaForm, new JavaConstant[0]);
|
||||
}
|
||||
/* Load non-public field: MemberName LambdaForm.vmentry */
|
||||
JavaConstant memberName = constantReflection.readFieldValue(LazyInitialization.lambdaFormVmentryField, lambdaForm);
|
||||
if (memberName.isNull() && forceBytecodeGeneration) {
|
||||
Object lf = ((HotSpotObjectConstant) lambdaForm).asObject(LazyInitialization.lambdaFormType);
|
||||
compilerToVM().compileToBytecode(Objects.requireNonNull(lf));
|
||||
memberName = constantReflection.readFieldValue(LazyInitialization.lambdaFormVmentryField, lambdaForm);
|
||||
assert memberName.isNonNull();
|
||||
}
|
||||
return getTargetMethod(memberName);
|
||||
}
|
||||
|
||||
@ -200,4 +160,3 @@ public class HotSpotMethodHandleAccessProvider implements MethodHandleAccessProv
|
||||
return compilerToVM().getResolvedJavaMethod(object, LazyInitialization.memberNameVmtargetField.offset());
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -0,0 +1,66 @@
|
||||
/*
|
||||
* Copyright (c) 2016, 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.
|
||||
*/
|
||||
package jdk.vm.ci.hotspot;
|
||||
|
||||
import static java.lang.reflect.Modifier.ABSTRACT;
|
||||
import static java.lang.reflect.Modifier.FINAL;
|
||||
import static java.lang.reflect.Modifier.INTERFACE;
|
||||
import static java.lang.reflect.Modifier.NATIVE;
|
||||
import static java.lang.reflect.Modifier.PRIVATE;
|
||||
import static java.lang.reflect.Modifier.PROTECTED;
|
||||
import static java.lang.reflect.Modifier.PUBLIC;
|
||||
import static java.lang.reflect.Modifier.STATIC;
|
||||
import static java.lang.reflect.Modifier.STRICT;
|
||||
import static java.lang.reflect.Modifier.SYNCHRONIZED;
|
||||
import static java.lang.reflect.Modifier.TRANSIENT;
|
||||
import static java.lang.reflect.Modifier.VOLATILE;
|
||||
import static jdk.vm.ci.hotspot.HotSpotVMConfig.config;
|
||||
|
||||
import java.lang.reflect.Modifier;
|
||||
|
||||
/**
|
||||
* The non-public modifiers in {@link Modifier} that need to be retrieved from
|
||||
* {@link HotSpotVMConfig}.
|
||||
*/
|
||||
public class HotSpotModifiers {
|
||||
|
||||
// @formatter:off
|
||||
public static final int ANNOTATION = config().jvmAccAnnotation;
|
||||
public static final int ENUM = config().jvmAccEnum;
|
||||
public static final int VARARGS = config().jvmAccVarargs;
|
||||
public static final int BRIDGE = config().jvmAccBridge;
|
||||
public static final int SYNTHETIC = config().jvmAccSynthetic;
|
||||
// @formatter:on
|
||||
|
||||
public static int jvmClassModifiers() {
|
||||
return PUBLIC | FINAL | INTERFACE | ABSTRACT | ANNOTATION | ENUM | SYNTHETIC;
|
||||
}
|
||||
|
||||
public static int jvmMethodModifiers() {
|
||||
return PUBLIC | PRIVATE | PROTECTED | STATIC | FINAL | SYNCHRONIZED | BRIDGE | VARARGS | NATIVE | ABSTRACT | STRICT | SYNTHETIC;
|
||||
}
|
||||
|
||||
public static int jvmFieldModifiers() {
|
||||
return PUBLIC | PRIVATE | PROTECTED | STATIC | FINAL | VOLATILE | TRANSIENT | ENUM | SYNTHETIC;
|
||||
}
|
||||
}
|
@ -22,6 +22,7 @@
|
||||
*/
|
||||
package jdk.vm.ci.hotspot;
|
||||
|
||||
import static jdk.vm.ci.hotspot.HotSpotModifiers.jvmFieldModifiers;
|
||||
import static jdk.vm.ci.hotspot.HotSpotVMConfig.config;
|
||||
|
||||
import java.lang.annotation.Annotation;
|
||||
@ -29,7 +30,6 @@ import java.lang.reflect.Field;
|
||||
|
||||
import jdk.internal.vm.annotation.Stable;
|
||||
import jdk.vm.ci.meta.JavaType;
|
||||
import jdk.vm.ci.meta.ModifiersProvider;
|
||||
import jdk.vm.ci.meta.ResolvedJavaType;
|
||||
|
||||
/**
|
||||
@ -81,7 +81,7 @@ class HotSpotResolvedJavaFieldImpl implements HotSpotResolvedJavaField {
|
||||
|
||||
@Override
|
||||
public int getModifiers() {
|
||||
return modifiers & ModifiersProvider.jvmFieldModifiers();
|
||||
return modifiers & jvmFieldModifiers();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -24,13 +24,15 @@ package jdk.vm.ci.hotspot;
|
||||
|
||||
import static jdk.vm.ci.hotspot.CompilerToVM.compilerToVM;
|
||||
import static jdk.vm.ci.hotspot.HotSpotJVMCIRuntime.runtime;
|
||||
import static jdk.vm.ci.hotspot.HotSpotModifiers.BRIDGE;
|
||||
import static jdk.vm.ci.hotspot.HotSpotModifiers.SYNTHETIC;
|
||||
import static jdk.vm.ci.hotspot.HotSpotModifiers.VARARGS;
|
||||
import static jdk.vm.ci.hotspot.HotSpotModifiers.jvmMethodModifiers;
|
||||
import static jdk.vm.ci.hotspot.HotSpotVMConfig.config;
|
||||
import static jdk.vm.ci.hotspot.UnsafeAccess.UNSAFE;
|
||||
|
||||
import java.lang.annotation.Annotation;
|
||||
import java.lang.reflect.Executable;
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.lang.reflect.Method;
|
||||
import java.lang.reflect.Modifier;
|
||||
import java.lang.reflect.Type;
|
||||
import java.util.HashMap;
|
||||
@ -42,13 +44,11 @@ import jdk.vm.ci.meta.Constant;
|
||||
import jdk.vm.ci.meta.ConstantPool;
|
||||
import jdk.vm.ci.meta.DefaultProfilingInfo;
|
||||
import jdk.vm.ci.meta.ExceptionHandler;
|
||||
import jdk.vm.ci.meta.JavaConstant;
|
||||
import jdk.vm.ci.meta.JavaMethod;
|
||||
import jdk.vm.ci.meta.JavaType;
|
||||
import jdk.vm.ci.meta.LineNumberTable;
|
||||
import jdk.vm.ci.meta.Local;
|
||||
import jdk.vm.ci.meta.LocalVariableTable;
|
||||
import jdk.vm.ci.meta.ModifiersProvider;
|
||||
import jdk.vm.ci.meta.ProfilingInfo;
|
||||
import jdk.vm.ci.meta.ResolvedJavaMethod;
|
||||
import jdk.vm.ci.meta.ResolvedJavaType;
|
||||
@ -210,7 +210,7 @@ final class HotSpotResolvedJavaMethodImpl extends HotSpotMethod implements HotSp
|
||||
|
||||
@Override
|
||||
public int getModifiers() {
|
||||
return getAllModifiers() & ModifiersProvider.jvmMethodModifiers();
|
||||
return getAllModifiers() & jvmMethodModifiers();
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -490,6 +490,19 @@ final class HotSpotResolvedJavaMethodImpl extends HotSpotMethod implements HotSp
|
||||
return javaMethod == null ? null : javaMethod.getAnnotation(annotationClass);
|
||||
}
|
||||
|
||||
public boolean isBridge() {
|
||||
return (BRIDGE & getModifiers()) != 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isSynthetic() {
|
||||
return (SYNTHETIC & getModifiers()) != 0;
|
||||
}
|
||||
|
||||
public boolean isVarArgs() {
|
||||
return (VARARGS & getModifiers()) != 0;
|
||||
}
|
||||
|
||||
public boolean isDefault() {
|
||||
if (isConstructor()) {
|
||||
return false;
|
||||
@ -697,27 +710,6 @@ final class HotSpotResolvedJavaMethodImpl extends HotSpotMethod implements HotSp
|
||||
return (getFlags() & config().methodFlagsIntrinsicCandidate) != 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public JavaConstant invoke(JavaConstant receiver, JavaConstant[] arguments) {
|
||||
assert !isConstructor();
|
||||
Method javaMethod = (Method) toJava();
|
||||
javaMethod.setAccessible(true);
|
||||
|
||||
Object[] objArguments = new Object[arguments.length];
|
||||
for (int i = 0; i < arguments.length; i++) {
|
||||
objArguments[i] = HotSpotObjectConstantImpl.asBoxedValue(arguments[i]);
|
||||
}
|
||||
Object objReceiver = receiver != null && !receiver.isNull() ? ((HotSpotObjectConstantImpl) receiver).object() : null;
|
||||
|
||||
try {
|
||||
Object objResult = javaMethod.invoke(objReceiver, objArguments);
|
||||
return javaMethod.getReturnType() == void.class ? null : HotSpotObjectConstantImpl.forBoxedValue(getSignature().getReturnKind(), objResult);
|
||||
|
||||
} catch (IllegalAccessException | InvocationTargetException ex) {
|
||||
throw new IllegalArgumentException(ex);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Allocates a compile id for this method by asking the VM for one.
|
||||
*
|
||||
|
@ -26,6 +26,7 @@ import static java.util.Objects.requireNonNull;
|
||||
import static jdk.vm.ci.hotspot.CompilerToVM.compilerToVM;
|
||||
import static jdk.vm.ci.hotspot.HotSpotConstantPool.isSignaturePolymorphicHolder;
|
||||
import static jdk.vm.ci.hotspot.HotSpotJVMCIRuntime.runtime;
|
||||
import static jdk.vm.ci.hotspot.HotSpotModifiers.jvmClassModifiers;
|
||||
import static jdk.vm.ci.hotspot.HotSpotVMConfig.config;
|
||||
import static jdk.vm.ci.hotspot.UnsafeAccess.UNSAFE;
|
||||
|
||||
@ -49,7 +50,6 @@ import jdk.vm.ci.meta.Constant;
|
||||
import jdk.vm.ci.meta.JavaConstant;
|
||||
import jdk.vm.ci.meta.JavaKind;
|
||||
import jdk.vm.ci.meta.JavaType;
|
||||
import jdk.vm.ci.meta.ModifiersProvider;
|
||||
import jdk.vm.ci.meta.ResolvedJavaField;
|
||||
import jdk.vm.ci.meta.ResolvedJavaMethod;
|
||||
import jdk.vm.ci.meta.ResolvedJavaType;
|
||||
@ -152,7 +152,7 @@ final class HotSpotResolvedObjectTypeImpl extends HotSpotResolvedJavaType implem
|
||||
if (isArray()) {
|
||||
return (getElementalType().getModifiers() & (Modifier.PUBLIC | Modifier.PRIVATE | Modifier.PROTECTED)) | Modifier.FINAL | Modifier.ABSTRACT;
|
||||
} else {
|
||||
return getAccessFlags() & ModifiersProvider.jvmClassModifiers();
|
||||
return getAccessFlags() & jvmClassModifiers();
|
||||
}
|
||||
}
|
||||
|
||||
@ -507,7 +507,7 @@ final class HotSpotResolvedObjectTypeImpl extends HotSpotResolvedJavaType implem
|
||||
synchronized HotSpotResolvedJavaField createField(String fieldName, JavaType type, long offset, int rawFlags) {
|
||||
HotSpotResolvedJavaField result = null;
|
||||
|
||||
final int flags = rawFlags & ModifiersProvider.jvmFieldModifiers();
|
||||
final int flags = rawFlags & HotSpotModifiers.jvmFieldModifiers();
|
||||
|
||||
final long id = offset + ((long) flags << 32);
|
||||
|
||||
|
@ -117,8 +117,12 @@ class HotSpotVMConfig extends HotSpotVMConfigAccess {
|
||||
final int jvmAccFieldHasGenericSignature = getConstant("JVM_ACC_FIELD_HAS_GENERIC_SIGNATURE", Integer.class);
|
||||
final int jvmAccIsCloneableFast = getConstant("JVM_ACC_IS_CLONEABLE_FAST", Integer.class);
|
||||
|
||||
// Modifier.SYNTHETIC is not public so we get it via vmStructs.
|
||||
// These modifiers are not public in Modifier so we get them via vmStructs.
|
||||
final int jvmAccSynthetic = getConstant("JVM_ACC_SYNTHETIC", Integer.class);
|
||||
final int jvmAccAnnotation = getConstant("JVM_ACC_ANNOTATION", Integer.class);
|
||||
final int jvmAccBridge = getConstant("JVM_ACC_BRIDGE", Integer.class);
|
||||
final int jvmAccVarargs = getConstant("JVM_ACC_VARARGS", Integer.class);
|
||||
final int jvmAccEnum = getConstant("JVM_ACC_ENUM", Integer.class);
|
||||
|
||||
// This is only valid on AMD64.
|
||||
final int runtimeCallStackSize = getConstant("frame::arg_reg_save_area_bytes", Integer.class, osArch.equals("amd64") ? null : 0);
|
||||
|
@ -22,8 +22,6 @@
|
||||
*/
|
||||
package jdk.vm.ci.hotspot;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
|
||||
import jdk.internal.misc.Unsafe;
|
||||
|
||||
/**
|
||||
@ -31,21 +29,5 @@ import jdk.internal.misc.Unsafe;
|
||||
*/
|
||||
class UnsafeAccess {
|
||||
|
||||
static final Unsafe UNSAFE = initUnsafe();
|
||||
|
||||
private static Unsafe initUnsafe() {
|
||||
try {
|
||||
// Fast path when we are trusted.
|
||||
return Unsafe.getUnsafe();
|
||||
} catch (SecurityException se) {
|
||||
// Slow path when we are not trusted.
|
||||
try {
|
||||
Field theUnsafe = Unsafe.class.getDeclaredField("theUnsafe");
|
||||
theUnsafe.setAccessible(true);
|
||||
return (Unsafe) theUnsafe.get(Unsafe.class);
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException("exception while trying to get Unsafe", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
static final Unsafe UNSAFE = Unsafe.getUnsafe();
|
||||
}
|
||||
|
@ -22,9 +22,6 @@
|
||||
*/
|
||||
package jdk.vm.ci.meta;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.lang.reflect.Modifier;
|
||||
|
||||
/**
|
||||
* Miscellaneous collection of utility methods used by {@code jdk.vm.ci.meta} and its clients.
|
||||
*/
|
||||
@ -226,17 +223,4 @@ public class MetaUtil {
|
||||
}
|
||||
return obj.getClass().getName() + "@" + System.identityHashCode(obj);
|
||||
}
|
||||
|
||||
/**
|
||||
* Used to lookup constants from {@link Modifier} that are not public (VARARGS, SYNTHETIC etc.).
|
||||
*/
|
||||
static int getNonPublicModifierStaticField(String name) {
|
||||
try {
|
||||
Field field = Modifier.class.getDeclaredField(name);
|
||||
field.setAccessible(true);
|
||||
return field.getInt(null);
|
||||
} catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) {
|
||||
throw new InternalError(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -22,18 +22,9 @@
|
||||
*/
|
||||
package jdk.vm.ci.meta;
|
||||
|
||||
import static java.lang.reflect.Modifier.ABSTRACT;
|
||||
import static java.lang.reflect.Modifier.FINAL;
|
||||
import static java.lang.reflect.Modifier.INTERFACE;
|
||||
import static java.lang.reflect.Modifier.NATIVE;
|
||||
import static java.lang.reflect.Modifier.PRIVATE;
|
||||
import static java.lang.reflect.Modifier.PROTECTED;
|
||||
import static java.lang.reflect.Modifier.PUBLIC;
|
||||
import static java.lang.reflect.Modifier.STATIC;
|
||||
import static java.lang.reflect.Modifier.STRICT;
|
||||
import static java.lang.reflect.Modifier.SYNCHRONIZED;
|
||||
import static java.lang.reflect.Modifier.TRANSIENT;
|
||||
import static java.lang.reflect.Modifier.VOLATILE;
|
||||
|
||||
import java.lang.reflect.Modifier;
|
||||
|
||||
@ -42,17 +33,9 @@ import java.lang.reflect.Modifier;
|
||||
* language {@linkplain #getModifiers() modifiers}.
|
||||
*/
|
||||
public interface ModifiersProvider {
|
||||
int BRIDGE = MetaUtil.getNonPublicModifierStaticField("BRIDGE");
|
||||
int VARARGS = MetaUtil.getNonPublicModifierStaticField("VARARGS");
|
||||
int SYNTHETIC = MetaUtil.getNonPublicModifierStaticField("SYNTHETIC");
|
||||
int ANNOTATION = MetaUtil.getNonPublicModifierStaticField("ANNOTATION");
|
||||
int ENUM = MetaUtil.getNonPublicModifierStaticField("ENUM");
|
||||
int MANDATED = MetaUtil.getNonPublicModifierStaticField("MANDATED");
|
||||
|
||||
/**
|
||||
* Returns the Java Virtual Machine modifiers for this element. Note that this can differ from
|
||||
* standard Java Reflection modifiers. For example at the JVM level, classes (
|
||||
* {@link ResolvedJavaType}) can not be private or protected.
|
||||
* Returns the modifiers for this element.
|
||||
*/
|
||||
int getModifiers();
|
||||
|
||||
@ -161,17 +144,4 @@ public interface ModifiersProvider {
|
||||
default boolean isConcrete() {
|
||||
return !isAbstract();
|
||||
}
|
||||
|
||||
static int jvmClassModifiers() {
|
||||
// no SUPER
|
||||
return PUBLIC | FINAL | INTERFACE | ABSTRACT | ANNOTATION | ENUM | SYNTHETIC;
|
||||
}
|
||||
|
||||
static int jvmMethodModifiers() {
|
||||
return PUBLIC | PRIVATE | PROTECTED | STATIC | FINAL | SYNCHRONIZED | BRIDGE | VARARGS | NATIVE | ABSTRACT | STRICT | SYNTHETIC;
|
||||
}
|
||||
|
||||
static int jvmFieldModifiers() {
|
||||
return PUBLIC | PRIVATE | PROTECTED | STATIC | FINAL | VOLATILE | TRANSIENT | ENUM | SYNTHETIC;
|
||||
}
|
||||
}
|
||||
|
@ -26,7 +26,6 @@ import java.lang.annotation.Annotation;
|
||||
import java.lang.reflect.AnnotatedElement;
|
||||
import java.lang.reflect.Array;
|
||||
import java.lang.reflect.Method;
|
||||
import java.lang.reflect.Modifier;
|
||||
import java.lang.reflect.Type;
|
||||
|
||||
/**
|
||||
@ -72,14 +71,6 @@ public interface ResolvedJavaMethod extends JavaMethod, InvokeTarget, ModifiersP
|
||||
*/
|
||||
int getMaxStackSize();
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
* <p>
|
||||
* Only the {@linkplain Modifier#methodModifiers() method flags} specified in the JVM
|
||||
* specification will be included in the returned mask.
|
||||
*/
|
||||
int getModifiers();
|
||||
|
||||
default boolean isFinal() {
|
||||
return ModifiersProvider.super.isFinalFlagSet();
|
||||
}
|
||||
@ -88,9 +79,7 @@ public interface ResolvedJavaMethod extends JavaMethod, InvokeTarget, ModifiersP
|
||||
* Determines if this method is a synthetic method as defined by the Java Language
|
||||
* Specification.
|
||||
*/
|
||||
default boolean isSynthetic() {
|
||||
return (SYNTHETIC & getModifiers()) == SYNTHETIC;
|
||||
}
|
||||
boolean isSynthetic();
|
||||
|
||||
/**
|
||||
* Checks that the method is a
|
||||
@ -99,9 +88,7 @@ public interface ResolvedJavaMethod extends JavaMethod, InvokeTarget, ModifiersP
|
||||
*
|
||||
* @return whether the method is a varargs method
|
||||
*/
|
||||
default boolean isVarArgs() {
|
||||
return (VARARGS & getModifiers()) == VARARGS;
|
||||
}
|
||||
boolean isVarArgs();
|
||||
|
||||
/**
|
||||
* Checks that the method is a
|
||||
@ -110,9 +97,7 @@ public interface ResolvedJavaMethod extends JavaMethod, InvokeTarget, ModifiersP
|
||||
*
|
||||
* @return whether the method is a bridge method
|
||||
*/
|
||||
default boolean isBridge() {
|
||||
return (BRIDGE & getModifiers()) == BRIDGE;
|
||||
}
|
||||
boolean isBridge();
|
||||
|
||||
/**
|
||||
* Returns {@code true} if this method is a default method; returns {@code false} otherwise.
|
||||
@ -227,18 +212,6 @@ public interface ResolvedJavaMethod extends JavaMethod, InvokeTarget, ModifiersP
|
||||
*/
|
||||
LocalVariableTable getLocalVariableTable();
|
||||
|
||||
/**
|
||||
* Invokes the underlying method represented by this object, on the specified object with the
|
||||
* specified parameters. This method is similar to a reflective method invocation by
|
||||
* {@link Method#invoke}.
|
||||
*
|
||||
* @param receiver The receiver for the invocation, or {@code null} if it is a static method.
|
||||
* @param arguments The arguments for the invocation.
|
||||
* @return The value returned by the method invocation, or {@code null} if the return type is
|
||||
* {@code void}.
|
||||
*/
|
||||
JavaConstant invoke(JavaConstant receiver, JavaConstant[] arguments);
|
||||
|
||||
/**
|
||||
* Gets the encoding of (that is, a constant representing the value of) this method.
|
||||
*
|
||||
|
@ -68,15 +68,6 @@ public interface ResolvedJavaType extends JavaType, ModifiersProvider, Annotated
|
||||
*/
|
||||
boolean isPrimitive();
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
* <p>
|
||||
* Only the flags specified in the JVM specification will be included in the returned mask. This
|
||||
* method is identical to {@link Class#getModifiers()} in terms of the value return for this
|
||||
* type.
|
||||
*/
|
||||
int getModifiers();
|
||||
|
||||
/*
|
||||
* The setting of the final bit for types is a bit confusing since arrays are marked as final.
|
||||
* This method provides a semantically equivalent test that appropriate for types.
|
||||
|
@ -2366,7 +2366,9 @@ bool os::win32::get_frame_at_stack_banging_point(JavaThread* thread,
|
||||
if (Interpreter::contains(pc)) {
|
||||
*fr = os::fetch_frame_from_context((void*)exceptionInfo->ContextRecord);
|
||||
if (!fr->is_first_java_frame()) {
|
||||
assert(fr->safe_for_sender(thread), "Safety check");
|
||||
// get_frame_at_stack_banging_point() is only called when we
|
||||
// have well defined stacks so java_sender() calls do not need
|
||||
// to assert safe_for_sender() first.
|
||||
*fr = fr->java_sender();
|
||||
}
|
||||
} else {
|
||||
@ -2383,7 +2385,7 @@ bool os::win32::get_frame_at_stack_banging_point(JavaThread* thread,
|
||||
// has been pushed on the stack
|
||||
*fr = frame(fr->sp() + 1, fr->fp(), (address)*(fr->sp()));
|
||||
if (!fr->is_java_frame()) {
|
||||
assert(fr->safe_for_sender(thread), "Safety check");
|
||||
// See java_sender() comment above.
|
||||
*fr = fr->java_sender();
|
||||
}
|
||||
}
|
||||
|
@ -378,7 +378,9 @@ bool os::Bsd::get_frame_at_stack_banging_point(JavaThread* thread, ucontext_t* u
|
||||
// method returns the Java sender of the current frame.
|
||||
*fr = os::fetch_frame_from_ucontext(thread, uc);
|
||||
if (!fr->is_first_java_frame()) {
|
||||
assert(fr->safe_for_sender(thread), "Safety check");
|
||||
// get_frame_at_stack_banging_point() is only called when we
|
||||
// have well defined stacks so java_sender() calls do not need
|
||||
// to assert safe_for_sender() first.
|
||||
*fr = fr->java_sender();
|
||||
}
|
||||
} else {
|
||||
@ -395,7 +397,7 @@ bool os::Bsd::get_frame_at_stack_banging_point(JavaThread* thread, ucontext_t* u
|
||||
// has been pushed on the stack
|
||||
*fr = frame(fr->sp() + 1, fr->fp(), (address)*(fr->sp()));
|
||||
if (!fr->is_java_frame()) {
|
||||
assert(fr->safe_for_sender(thread), "Safety check");
|
||||
// See java_sender() comment above.
|
||||
*fr = fr->java_sender();
|
||||
}
|
||||
}
|
||||
|
@ -191,7 +191,9 @@ bool os::Linux::get_frame_at_stack_banging_point(JavaThread* thread, ucontext_t*
|
||||
// method returns the Java sender of the current frame.
|
||||
*fr = os::fetch_frame_from_ucontext(thread, uc);
|
||||
if (!fr->is_first_java_frame()) {
|
||||
assert(fr->safe_for_sender(thread), "Safety check");
|
||||
// get_frame_at_stack_banging_point() is only called when we
|
||||
// have well defined stacks so java_sender() calls do not need
|
||||
// to assert safe_for_sender() first.
|
||||
*fr = fr->java_sender();
|
||||
}
|
||||
} else {
|
||||
@ -209,8 +211,8 @@ bool os::Linux::get_frame_at_stack_banging_point(JavaThread* thread, ucontext_t*
|
||||
intptr_t* sp = os::Linux::ucontext_get_sp(uc);
|
||||
*fr = frame(sp + 1, fp, (address)*sp);
|
||||
if (!fr->is_java_frame()) {
|
||||
assert(fr->safe_for_sender(thread), "Safety check");
|
||||
assert(!fr->is_first_frame(), "Safety check");
|
||||
// See java_sender() comment above.
|
||||
*fr = fr->java_sender();
|
||||
}
|
||||
}
|
||||
|
@ -255,7 +255,9 @@ bool os::Solaris::get_frame_at_stack_banging_point(JavaThread* thread, ucontext_
|
||||
// method returns the Java sender of the current frame.
|
||||
*fr = os::fetch_frame_from_ucontext(thread, uc);
|
||||
if (!fr->is_first_java_frame()) {
|
||||
assert(fr->safe_for_sender(thread), "Safety check");
|
||||
// get_frame_at_stack_banging_point() is only called when we
|
||||
// have well defined stacks so java_sender() calls do not need
|
||||
// to assert safe_for_sender() first.
|
||||
*fr = fr->java_sender();
|
||||
}
|
||||
} else {
|
||||
@ -273,7 +275,7 @@ bool os::Solaris::get_frame_at_stack_banging_point(JavaThread* thread, ucontext_
|
||||
intptr_t* sp = os::Solaris::ucontext_get_sp(uc);
|
||||
*fr = frame(sp + 1, fp, (address)*sp);
|
||||
if (!fr->is_java_frame()) {
|
||||
assert(fr->safe_for_sender(thread), "Safety check");
|
||||
// See java_sender() comment above.
|
||||
*fr = fr->java_sender();
|
||||
}
|
||||
}
|
||||
|
@ -1245,6 +1245,7 @@ bool InstructForm::check_branch_variant(ArchDesc &AD, InstructForm *short_branch
|
||||
this != short_branch && // Don't match myself
|
||||
!is_short_branch() && // Don't match another short branch variant
|
||||
reduce_result() != NULL &&
|
||||
strstr(_ident, "restoreMask") == NULL && // Don't match side effects
|
||||
strcmp(reduce_result(), short_branch->reduce_result()) == 0 &&
|
||||
_matrule->equivalent(AD.globalNames(), short_branch->_matrule)) {
|
||||
// The instructions are equivalent.
|
||||
@ -4037,6 +4038,8 @@ int MatchRule::is_expensive() const {
|
||||
strcmp(opType,"EncodeP")==0 ||
|
||||
strcmp(opType,"EncodePKlass")==0 ||
|
||||
strcmp(opType,"DecodeNKlass")==0 ||
|
||||
strcmp(opType,"FmaD") == 0 ||
|
||||
strcmp(opType,"FmaF") == 0 ||
|
||||
strcmp(opType,"RoundDouble")==0 ||
|
||||
strcmp(opType,"RoundFloat")==0 ||
|
||||
strcmp(opType,"ReverseBytesI")==0 ||
|
||||
|
@ -162,6 +162,8 @@ bool Compiler::is_intrinsic_supported(const methodHandle& method) {
|
||||
case vmIntrinsics::_dlog10:
|
||||
case vmIntrinsics::_dexp:
|
||||
case vmIntrinsics::_dpow:
|
||||
case vmIntrinsics::_fmaD:
|
||||
case vmIntrinsics::_fmaF:
|
||||
case vmIntrinsics::_getObject:
|
||||
case vmIntrinsics::_getBoolean:
|
||||
case vmIntrinsics::_getByte:
|
||||
|
@ -666,7 +666,9 @@ void LIR_OpVisitState::visit(LIR_Op* op) {
|
||||
|
||||
// LIR_Op3
|
||||
case lir_idiv:
|
||||
case lir_irem: {
|
||||
case lir_irem:
|
||||
case lir_fmad:
|
||||
case lir_fmaf: {
|
||||
assert(op->as_Op3() != NULL, "must be");
|
||||
LIR_Op3* op3= (LIR_Op3*)op;
|
||||
|
||||
@ -1663,6 +1665,8 @@ const char * LIR_Op::name() const {
|
||||
// LIR_Op3
|
||||
case lir_idiv: s = "idiv"; break;
|
||||
case lir_irem: s = "irem"; break;
|
||||
case lir_fmad: s = "fmad"; break;
|
||||
case lir_fmaf: s = "fmaf"; break;
|
||||
// LIR_OpJavaCall
|
||||
case lir_static_call: s = "static"; break;
|
||||
case lir_optvirtual_call: s = "optvirtual"; break;
|
||||
|
@ -956,6 +956,8 @@ enum LIR_Code {
|
||||
, begin_op3
|
||||
, lir_idiv
|
||||
, lir_irem
|
||||
, lir_fmad
|
||||
, lir_fmaf
|
||||
, end_op3
|
||||
, begin_opJavaCall
|
||||
, lir_static_call
|
||||
@ -2149,6 +2151,8 @@ class LIR_List: public CompilationResourceObj {
|
||||
|
||||
void abs (LIR_Opr from, LIR_Opr to, LIR_Opr tmp) { append(new LIR_Op2(lir_abs , from, tmp, to)); }
|
||||
void sqrt(LIR_Opr from, LIR_Opr to, LIR_Opr tmp) { append(new LIR_Op2(lir_sqrt, from, tmp, to)); }
|
||||
void fmad(LIR_Opr from, LIR_Opr from1, LIR_Opr from2, LIR_Opr to) { append(new LIR_Op3(lir_fmad, from, from1, from2, to)); }
|
||||
void fmaf(LIR_Opr from, LIR_Opr from1, LIR_Opr from2, LIR_Opr to) { append(new LIR_Op3(lir_fmaf, from, from1, from2, to)); }
|
||||
void log10 (LIR_Opr from, LIR_Opr to, LIR_Opr tmp) { append(new LIR_Op2(lir_log10, from, LIR_OprFact::illegalOpr, to, tmp)); }
|
||||
void tan (LIR_Opr from, LIR_Opr to, LIR_Opr tmp1, LIR_Opr tmp2) { append(new LIR_Op2(lir_tan , from, tmp1, to, tmp2)); }
|
||||
|
||||
|
@ -3181,6 +3181,9 @@ void LIRGenerator::do_Intrinsic(Intrinsic* x) {
|
||||
case vmIntrinsics::_dpow : do_MathIntrinsic(x); break;
|
||||
case vmIntrinsics::_arraycopy: do_ArrayCopy(x); break;
|
||||
|
||||
case vmIntrinsics::_fmaD: do_FmaIntrinsic(x); break;
|
||||
case vmIntrinsics::_fmaF: do_FmaIntrinsic(x); break;
|
||||
|
||||
// java.nio.Buffer.checkIndex
|
||||
case vmIntrinsics::_checkIndex: do_NIOCheckIndex(x); break;
|
||||
|
||||
@ -3244,14 +3247,14 @@ void LIRGenerator::profile_arguments(ProfileCall* x) {
|
||||
Bytecodes::Code bc = x->method()->java_code_at_bci(bci);
|
||||
int start = 0;
|
||||
int stop = data->is_CallTypeData() ? ((ciCallTypeData*)data)->number_of_arguments() : ((ciVirtualCallTypeData*)data)->number_of_arguments();
|
||||
if (x->inlined() && x->callee()->is_static() && Bytecodes::has_receiver(bc)) {
|
||||
if (x->callee()->is_loaded() && x->callee()->is_static() && Bytecodes::has_receiver(bc)) {
|
||||
// first argument is not profiled at call (method handle invoke)
|
||||
assert(x->method()->raw_code_at_bci(bci) == Bytecodes::_invokehandle, "invokehandle expected");
|
||||
start = 1;
|
||||
}
|
||||
ciSignature* callee_signature = x->callee()->signature();
|
||||
// method handle call to virtual method
|
||||
bool has_receiver = x->inlined() && !x->callee()->is_static() && !Bytecodes::has_receiver(bc);
|
||||
bool has_receiver = x->callee()->is_loaded() && !x->callee()->is_static() && !Bytecodes::has_receiver(bc);
|
||||
ciSignatureStream callee_signature_stream(callee_signature, has_receiver ? x->callee()->holder() : NULL);
|
||||
|
||||
bool ignored_will_link;
|
||||
|
@ -245,6 +245,7 @@ class LIRGenerator: public InstructionVisitor, public BlockClosure {
|
||||
void do_isPrimitive(Intrinsic* x);
|
||||
void do_getClass(Intrinsic* x);
|
||||
void do_currentThread(Intrinsic* x);
|
||||
void do_FmaIntrinsic(Intrinsic* x);
|
||||
void do_MathIntrinsic(Intrinsic* x);
|
||||
void do_LibmIntrinsic(Intrinsic* x);
|
||||
void do_ArrayCopy(Intrinsic* x);
|
||||
|
@ -85,6 +85,7 @@ typedef jboolean (JNICALL *ReadMappedEntry_t)(jzfile *zip, jzentry *entry, unsig
|
||||
typedef jzentry* (JNICALL *GetNextEntry_t)(jzfile *zip, jint n);
|
||||
typedef jboolean (JNICALL *ZipInflateFully_t)(void *inBuf, jlong inLen, void *outBuf, jlong outLen, char **pmsg);
|
||||
typedef jint (JNICALL *Crc32_t)(jint crc, const jbyte *buf, jint len);
|
||||
typedef void (JNICALL *FreeEntry_t)(jzfile *zip, jzentry *entry);
|
||||
|
||||
static ZipOpen_t ZipOpen = NULL;
|
||||
static ZipClose_t ZipClose = NULL;
|
||||
@ -95,6 +96,7 @@ static GetNextEntry_t GetNextEntry = NULL;
|
||||
static canonicalize_fn_t CanonicalizeEntry = NULL;
|
||||
static ZipInflateFully_t ZipInflateFully = NULL;
|
||||
static Crc32_t Crc32 = NULL;
|
||||
static FreeEntry_t FreeEntry = NULL;
|
||||
|
||||
// Entry points for jimage.dll for loading jimage file entries
|
||||
|
||||
@ -150,6 +152,7 @@ int ClassLoader::_num_entries = 0;
|
||||
GrowableArray<char*>* ClassLoader::_boot_modules_array = NULL;
|
||||
GrowableArray<char*>* ClassLoader::_platform_modules_array = NULL;
|
||||
SharedPathsMiscInfo* ClassLoader::_shared_paths_misc_info = NULL;
|
||||
int ClassLoader::_num_patch_mod_prefixes = 0;
|
||||
#endif
|
||||
|
||||
// helper routines
|
||||
@ -319,6 +322,20 @@ ClassPathZipEntry::~ClassPathZipEntry() {
|
||||
FREE_C_HEAP_ARRAY(char, _zip_name);
|
||||
}
|
||||
|
||||
bool ClassPathZipEntry::stream_exists(const char* name) {
|
||||
// enable call to C land
|
||||
JavaThread* thread = JavaThread::current();
|
||||
ThreadToNativeFromVM ttn(thread);
|
||||
// check whether zip archive contains name
|
||||
jint name_len, filesize;
|
||||
jzentry* entry = (*FindEntry)(_zip, name, &filesize, &name_len);
|
||||
if (entry != NULL) {
|
||||
(*FreeEntry)(_zip, entry);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
u1* ClassPathZipEntry::open_entry(const char* name, jint* filesize, bool nul_terminate, TRAPS) {
|
||||
// enable call to C land
|
||||
JavaThread* thread = JavaThread::current();
|
||||
@ -640,7 +657,7 @@ void ClassLoader::check_shared_classpath(const char *path) {
|
||||
|
||||
struct stat st;
|
||||
if (os::stat(path, &st) == 0) {
|
||||
if ((st.st_mode & S_IFREG) != S_IFREG) { // is directory
|
||||
if ((st.st_mode & S_IFMT) != S_IFREG) { // is not a regular file
|
||||
if (!os::dir_is_empty(path)) {
|
||||
tty->print_cr("Error: non-empty directory '%s'", path);
|
||||
exit_with_path_failure("CDS allows only empty directories in archived classpaths", NULL);
|
||||
@ -693,8 +710,6 @@ void ClassLoader::setup_patch_mod_entries() {
|
||||
GrowableArray<ModulePatchPath*>* patch_mod_args = Arguments::get_patch_mod_prefix();
|
||||
int num_of_entries = patch_mod_args->length();
|
||||
|
||||
assert(!DumpSharedSpaces, "DumpSharedSpaces not supported with --patch-module");
|
||||
assert(!UseSharedSpaces, "UseSharedSpaces not supported with --patch-module");
|
||||
|
||||
// Set up the boot loader's _patch_mod_entries list
|
||||
_patch_mod_entries = new (ResourceObj::C_HEAP, mtModule) GrowableArray<ModuleClassPathList*>(num_of_entries, true);
|
||||
@ -851,7 +866,7 @@ ClassPathEntry* ClassLoader::create_class_path_entry(const char *path, const str
|
||||
bool is_boot_append, TRAPS) {
|
||||
JavaThread* thread = JavaThread::current();
|
||||
ClassPathEntry* new_entry = NULL;
|
||||
if ((st->st_mode & S_IFREG) == S_IFREG) {
|
||||
if ((st->st_mode & S_IFMT) == S_IFREG) {
|
||||
ResourceMark rm(thread);
|
||||
// Regular file, should be a zip or jimage file
|
||||
// Canonicalized filename
|
||||
@ -914,7 +929,7 @@ ClassPathZipEntry* ClassLoader::create_class_path_zip_entry(const char *path, bo
|
||||
// check for a regular file
|
||||
struct stat st;
|
||||
if (os::stat(path, &st) == 0) {
|
||||
if ((st.st_mode & S_IFREG) == S_IFREG) {
|
||||
if ((st.st_mode & S_IFMT) == S_IFREG) {
|
||||
char canonical_path[JVM_MAXPATHLEN];
|
||||
if (get_canonical_path(path, canonical_path, JVM_MAXPATHLEN)) {
|
||||
char* error_msg = NULL;
|
||||
@ -1068,6 +1083,7 @@ void ClassLoader::load_zip_library() {
|
||||
GetNextEntry = CAST_TO_FN_PTR(GetNextEntry_t, os::dll_lookup(handle, "ZIP_GetNextEntry"));
|
||||
ZipInflateFully = CAST_TO_FN_PTR(ZipInflateFully_t, os::dll_lookup(handle, "ZIP_InflateFully"));
|
||||
Crc32 = CAST_TO_FN_PTR(Crc32_t, os::dll_lookup(handle, "ZIP_CRC32"));
|
||||
FreeEntry = CAST_TO_FN_PTR(FreeEntry_t, os::dll_lookup(handle, "ZIP_FreeEntry"));
|
||||
|
||||
// ZIP_Close is not exported on Windows in JDK5.0 so don't abort if ZIP_Close is NULL
|
||||
if (ZipOpen == NULL || FindEntry == NULL || ReadEntry == NULL ||
|
||||
@ -1395,6 +1411,57 @@ ClassFileStream* ClassLoader::search_module_entries(const GrowableArray<ModuleCl
|
||||
return NULL;
|
||||
}
|
||||
|
||||
#if INCLUDE_CDS
|
||||
// The following function is only used during CDS dump time.
|
||||
// It checks if a class can be found in the jar entries of the _patch_mod_entries.
|
||||
// It does not support non-jar entries.
|
||||
bool ClassLoader::is_in_patch_module(const char* const file_name) {
|
||||
assert(DumpSharedSpaces, "dump time only");
|
||||
if (_patch_mod_entries == NULL) {
|
||||
return false;
|
||||
}
|
||||
|
||||
int num_of_entries = _patch_mod_entries->length();
|
||||
char* class_module_name = NULL;
|
||||
ResourceMark rm;
|
||||
const char *pkg_name = package_from_name(file_name);
|
||||
// Using the jimage to obtain the class' module name.
|
||||
// The ModuleEntryTable cannot be used at this point during dump time
|
||||
// because the module system hasn't been initialized yet.
|
||||
if (pkg_name != NULL) {
|
||||
JImageFile *jimage = _jrt_entry->jimage();
|
||||
class_module_name = (char*)(*JImagePackageToModule)(jimage, pkg_name);
|
||||
}
|
||||
|
||||
if (class_module_name == NULL) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Loop through all the patch module entries looking for module
|
||||
for (int i = 0; i < num_of_entries; i++) {
|
||||
ModuleClassPathList* module_cpl = _patch_mod_entries->at(i);
|
||||
Symbol* module_cpl_name = module_cpl->module_name();
|
||||
|
||||
if (strcmp(module_cpl_name->as_C_string(), class_module_name) == 0) {
|
||||
// Class' module has been located, attempt to locate
|
||||
// the class from the module's ClassPathEntry list.
|
||||
ClassPathEntry* e = module_cpl->module_first_entry();
|
||||
while (e != NULL) {
|
||||
if (e->is_jar_file()) {
|
||||
if (e->stream_exists(file_name)) {
|
||||
return true;
|
||||
} else {
|
||||
e = e->next();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
#endif // INCLUDE_CDS
|
||||
|
||||
instanceKlassHandle ClassLoader::load_class(Symbol* name, bool search_append_only, TRAPS) {
|
||||
assert(name != NULL, "invariant");
|
||||
assert(THREAD->is_Java_thread(), "must be a JavaThread");
|
||||
@ -1420,8 +1487,8 @@ instanceKlassHandle ClassLoader::load_class(Symbol* name, bool search_append_onl
|
||||
|
||||
// If DumpSharedSpaces is true boot loader visibility boundaries are set to:
|
||||
// - [jimage] + [_first_append_entry to _last_append_entry] (all path entries).
|
||||
// No --patch-module entries or exploded module builds are included since CDS
|
||||
// is not supported if --patch-module or exploded module builds are used.
|
||||
// If a class is found in the --patch-module entries, the class will not be included in the
|
||||
// CDS archive. Also, CDS is not supported if exploded module builds are used.
|
||||
//
|
||||
// If search_append_only is true, boot loader visibility boundaries are
|
||||
// set to be _first_append_entry to the end. This includes:
|
||||
@ -1444,8 +1511,17 @@ instanceKlassHandle ClassLoader::load_class(Symbol* name, bool search_append_onl
|
||||
// found within its module specification, the search should continue to Load Attempt #2.
|
||||
// Note: The --patch-module entries are never searched if the boot loader's
|
||||
// visibility boundary is limited to only searching the append entries.
|
||||
if (_patch_mod_entries != NULL && !search_append_only && !DumpSharedSpaces) {
|
||||
stream = search_module_entries(_patch_mod_entries, class_name, file_name, CHECK_NULL);
|
||||
if (_patch_mod_entries != NULL && !search_append_only) {
|
||||
if (!DumpSharedSpaces) {
|
||||
stream = search_module_entries(_patch_mod_entries, class_name, file_name, CHECK_NULL);
|
||||
} else {
|
||||
#if INCLUDE_CDS
|
||||
if (is_in_patch_module(file_name)) {
|
||||
tty->print_cr("Preload Warning: Skip archiving class %s found in --patch-module entry", class_name);
|
||||
return NULL;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
// Load Attempt #2: [jimage | exploded build]
|
||||
@ -1596,8 +1672,57 @@ void ClassLoader::initialize() {
|
||||
}
|
||||
|
||||
#if INCLUDE_CDS
|
||||
// Capture all the --patch-module entries specified during CDS dump time.
|
||||
// It also captures the non-existing path(s) and the required file(s) during inspecting
|
||||
// the entries.
|
||||
void ClassLoader::setup_patch_mod_path() {
|
||||
assert(DumpSharedSpaces, "only used with -Xshare:dump");
|
||||
ResourceMark rm;
|
||||
GrowableArray<ModulePatchPath*>* patch_mod_args = Arguments::get_patch_mod_prefix();
|
||||
if (patch_mod_args != NULL) {
|
||||
int num_of_entries = patch_mod_args->length();
|
||||
for (int i = 0; i < num_of_entries; i++) {
|
||||
const char* module_name = (patch_mod_args->at(i))->module_name();
|
||||
const char* module_path = (patch_mod_args->at(i))->path_string();
|
||||
int path_len = (int)strlen(module_path);
|
||||
int name_len = (int)strlen(module_name);
|
||||
int buf_len = name_len + path_len + 2; // add 2 for the '=' and NULL terminator
|
||||
int end = 0;
|
||||
char* buf = NEW_C_HEAP_ARRAY(char, buf_len, mtInternal);
|
||||
// Iterate over the module's class path entries
|
||||
for (int start = 0; start < path_len; start = end) {
|
||||
while (module_path[end] && module_path[end] != os::path_separator()[0]) {
|
||||
end++;
|
||||
}
|
||||
strncpy(buf, &module_path[start], end - start);
|
||||
buf[end - start] = '\0';
|
||||
struct stat st;
|
||||
if (os::stat(buf, &st) != 0) {
|
||||
// File not found
|
||||
_shared_paths_misc_info->add_nonexist_path(buf);
|
||||
} else {
|
||||
if ((st.st_mode & S_IFMT) != S_IFREG) { // is not a regular file
|
||||
vm_exit_during_initialization(
|
||||
"--patch-module requires a regular file during dumping", buf);
|
||||
} else {
|
||||
_shared_paths_misc_info->add_required_file(buf);
|
||||
}
|
||||
}
|
||||
while (module_path[end] == os::path_separator()[0]) {
|
||||
end++;
|
||||
}
|
||||
};
|
||||
jio_snprintf(buf, buf_len, "%s=%s", module_name, module_path);
|
||||
_shared_paths_misc_info->add_patch_mod_classpath((const char*)buf);
|
||||
_num_patch_mod_prefixes++;
|
||||
FREE_C_HEAP_ARRAY(char, buf);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ClassLoader::initialize_shared_path() {
|
||||
if (DumpSharedSpaces) {
|
||||
setup_patch_mod_path();
|
||||
ClassLoaderExt::setup_search_paths();
|
||||
_shared_paths_misc_info->write_jint(0); // see comments in SharedPathsMiscInfo::check()
|
||||
}
|
||||
|
@ -69,6 +69,7 @@ public:
|
||||
// Attempt to locate file_name through this class path entry.
|
||||
// Returns a class file parsing stream if successfull.
|
||||
virtual ClassFileStream* open_stream(const char* name, TRAPS) = 0;
|
||||
virtual bool stream_exists(const char* name) = 0;
|
||||
// Debugging
|
||||
NOT_PRODUCT(virtual void compile_the_world(Handle loader, TRAPS) = 0;)
|
||||
};
|
||||
@ -83,6 +84,7 @@ class ClassPathDirEntry: public ClassPathEntry {
|
||||
JImageFile* jimage() const { return NULL; }
|
||||
ClassPathDirEntry(const char* dir);
|
||||
ClassFileStream* open_stream(const char* name, TRAPS);
|
||||
bool stream_exists(const char* name) { return false; }
|
||||
// Debugging
|
||||
NOT_PRODUCT(void compile_the_world(Handle loader, TRAPS);)
|
||||
};
|
||||
@ -126,6 +128,7 @@ class ClassPathZipEntry: public ClassPathEntry {
|
||||
ClassFileStream* open_stream(const char* name, TRAPS);
|
||||
void contents_do(void f(const char* name, void* context), void* context);
|
||||
bool is_multiple_versioned(TRAPS) NOT_CDS_RETURN_(false);
|
||||
bool stream_exists(const char* name);
|
||||
// Debugging
|
||||
NOT_PRODUCT(void compile_the_world(Handle loader, TRAPS);)
|
||||
};
|
||||
@ -145,6 +148,7 @@ public:
|
||||
ClassPathImageEntry(JImageFile* jimage, const char* name);
|
||||
~ClassPathImageEntry();
|
||||
ClassFileStream* open_stream(const char* name, TRAPS);
|
||||
bool stream_exists(const char* name) { return false; }
|
||||
|
||||
// Debugging
|
||||
NOT_PRODUCT(void compile_the_world(Handle loader, TRAPS);)
|
||||
@ -255,6 +259,7 @@ class ClassLoader: AllStatic {
|
||||
|
||||
// Info used by CDS
|
||||
CDS_ONLY(static SharedPathsMiscInfo * _shared_paths_misc_info;)
|
||||
CDS_ONLY(static int _num_patch_mod_prefixes;)
|
||||
|
||||
// Initialization:
|
||||
// - setup the boot loader's system class path
|
||||
@ -427,6 +432,9 @@ class ClassLoader: AllStatic {
|
||||
static void initialize_module_loader_map(JImageFile* jimage);
|
||||
static s2 classloader_type(Symbol* class_name, ClassPathEntry* e,
|
||||
int classpath_index, TRAPS);
|
||||
static bool is_in_patch_module(const char* const file_name);
|
||||
static void setup_patch_mod_path(); // Only when -Xshare:dump
|
||||
static int num_patch_mod_prefixes() { return _num_patch_mod_prefixes; }
|
||||
#endif
|
||||
|
||||
static void trace_class_path(const char* msg, const char* name = NULL);
|
||||
|
@ -86,6 +86,9 @@ void SharedPathsMiscInfo::print_path(int type, const char* path) {
|
||||
case REQUIRED:
|
||||
out->print("Expecting that file %s must exist and is not altered", path);
|
||||
break;
|
||||
case PATCH_MOD:
|
||||
out->print("Expecting --patch-module=%s", path);
|
||||
break;
|
||||
default:
|
||||
ShouldNotReachHere();
|
||||
}
|
||||
@ -146,6 +149,9 @@ bool SharedPathsMiscInfo::check(jint type, const char* path) {
|
||||
// But we want it to not exist -> fail
|
||||
return fail("File must not exist");
|
||||
}
|
||||
if ((st.st_mode & S_IFMT) != S_IFREG) {
|
||||
return fail("Did not get a regular file as expected.");
|
||||
}
|
||||
time_t timestamp;
|
||||
long filesize;
|
||||
|
||||
@ -161,7 +167,26 @@ bool SharedPathsMiscInfo::check(jint type, const char* path) {
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case PATCH_MOD:
|
||||
{
|
||||
GrowableArray<ModulePatchPath*>* patch_mod_args = Arguments::get_patch_mod_prefix();
|
||||
if (patch_mod_args != NULL) {
|
||||
int num_of_entries = patch_mod_args->length();
|
||||
for (int i = 0; i < num_of_entries; i++) {
|
||||
const char* module_name = (patch_mod_args->at(i))->module_name();
|
||||
const char* path_string = (patch_mod_args->at(i))->path_string();
|
||||
size_t n = strlen(module_name);
|
||||
// path contains the module name, followed by '=', and one or more entries.
|
||||
// E.g.: "java.base=foo" or "java.naming=dir1:dir2:dir3"
|
||||
if ((strncmp(module_name, path, n) != 0) ||
|
||||
(path[n] != '=') ||
|
||||
(strcmp(path + n + 1, path_string) != 0)) {
|
||||
return fail("--patch-module mismatch, path not found in run time: ", path);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
return fail("Corrupted archive file header");
|
||||
}
|
||||
|
@ -104,10 +104,28 @@ public:
|
||||
add_path(path, NON_EXIST);
|
||||
}
|
||||
|
||||
// The path must exist and have required size and modification time
|
||||
void add_required_file(const char* path) {
|
||||
add_path(path, REQUIRED);
|
||||
|
||||
struct stat st;
|
||||
if (os::stat(path, &st) != 0) {
|
||||
assert(0, "sanity");
|
||||
#if INCLUDE_CDS
|
||||
ClassLoader::exit_with_path_failure("failed to os::stat(%s)", path); // should not happen
|
||||
#endif
|
||||
}
|
||||
write_time(st.st_mtime);
|
||||
write_long(st.st_size);
|
||||
}
|
||||
|
||||
// The path must exist, and must contain exactly <num_entries> files/dirs
|
||||
void add_boot_classpath(const char* path) {
|
||||
add_path(path, BOOT);
|
||||
}
|
||||
void add_patch_mod_classpath(const char* path) {
|
||||
add_path(path, PATCH_MOD);
|
||||
}
|
||||
int write_jint(jint num) {
|
||||
write(&num, sizeof(num));
|
||||
return 0;
|
||||
@ -129,7 +147,8 @@ public:
|
||||
enum {
|
||||
BOOT = 1,
|
||||
NON_EXIST = 2,
|
||||
REQUIRED = 3
|
||||
REQUIRED = 3,
|
||||
PATCH_MOD = 4
|
||||
};
|
||||
|
||||
virtual const char* type_name(int type) {
|
||||
@ -137,6 +156,7 @@ public:
|
||||
case BOOT: return "BOOT";
|
||||
case NON_EXIST: return "NON_EXIST";
|
||||
case REQUIRED: return "REQUIRED";
|
||||
case PATCH_MOD: return "PATCH_MOD";
|
||||
default: ShouldNotReachHere(); return "?";
|
||||
}
|
||||
}
|
||||
|
@ -710,53 +710,3 @@ int SymboltableDCmd::num_arguments() {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
#ifndef PRODUCT
|
||||
// Internal test of TempNewSymbol
|
||||
void Test_TempNewSymbol() {
|
||||
// Assert messages assume these symbols are unique, and the refcounts start at
|
||||
// one, but code does not rely on this.
|
||||
Thread* THREAD = Thread::current();
|
||||
Symbol* abc = SymbolTable::new_symbol("abc", CATCH);
|
||||
int abccount = abc->refcount();
|
||||
TempNewSymbol ss = abc;
|
||||
assert(ss->refcount() == abccount, "only one abc");
|
||||
assert(ss->refcount() == abc->refcount(), "should match TempNewSymbol");
|
||||
|
||||
Symbol* efg = SymbolTable::new_symbol("efg", CATCH);
|
||||
Symbol* hij = SymbolTable::new_symbol("hij", CATCH);
|
||||
int efgcount = efg->refcount();
|
||||
int hijcount = hij->refcount();
|
||||
|
||||
TempNewSymbol s1 = efg;
|
||||
TempNewSymbol s2 = hij;
|
||||
assert(s1->refcount() == efgcount, "one efg");
|
||||
assert(s2->refcount() == hijcount, "one hij");
|
||||
|
||||
// Assignment operator
|
||||
s1 = s2;
|
||||
assert(hij->refcount() == hijcount + 1, "should be two hij");
|
||||
assert(efg->refcount() == efgcount - 1, "should be no efg");
|
||||
|
||||
s1 = ss; // s1 is abc
|
||||
assert(s1->refcount() == abccount + 1, "should be two abc (s1 and ss)");
|
||||
assert(hij->refcount() == hijcount, "should only have one hij now (s2)");
|
||||
|
||||
s1 = s1; // self assignment
|
||||
assert(s1->refcount() == abccount + 1, "should still be two abc (s1 and ss)");
|
||||
|
||||
TempNewSymbol s3;
|
||||
Symbol* klm = SymbolTable::new_symbol("klm", CATCH);
|
||||
int klmcount = klm->refcount();
|
||||
s3 = klm; // assignment
|
||||
assert(s3->refcount() == klmcount, "only one klm now");
|
||||
|
||||
Symbol* xyz = SymbolTable::new_symbol("xyz", CATCH);
|
||||
int xyzcount = xyz->refcount();
|
||||
{ // inner scope
|
||||
TempNewSymbol s_inner = xyz;
|
||||
}
|
||||
assert(xyz->refcount() == (xyzcount - 1),
|
||||
"Should have been decremented by dtor in inner scope");
|
||||
}
|
||||
#endif // PRODUCT
|
||||
|
@ -355,6 +355,8 @@ bool vmIntrinsics::preserves_state(vmIntrinsics::ID id) {
|
||||
case vmIntrinsics::_updateBytesCRC32:
|
||||
case vmIntrinsics::_updateByteBufferCRC32:
|
||||
case vmIntrinsics::_vectorizedMismatch:
|
||||
case vmIntrinsics::_fmaD:
|
||||
case vmIntrinsics::_fmaF:
|
||||
return true;
|
||||
default:
|
||||
return false;
|
||||
@ -388,6 +390,8 @@ bool vmIntrinsics::can_trap(vmIntrinsics::ID id) {
|
||||
case vmIntrinsics::_updateBytesCRC32:
|
||||
case vmIntrinsics::_updateByteBufferCRC32:
|
||||
case vmIntrinsics::_vectorizedMismatch:
|
||||
case vmIntrinsics::_fmaD:
|
||||
case vmIntrinsics::_fmaF:
|
||||
return false;
|
||||
default:
|
||||
return true;
|
||||
@ -536,6 +540,10 @@ bool vmIntrinsics::is_disabled_by_flags(vmIntrinsics::ID id) {
|
||||
case vmIntrinsics::_doubleToLongBits:
|
||||
if (!InlineMathNatives) return true;
|
||||
break;
|
||||
case vmIntrinsics::_fmaD:
|
||||
case vmIntrinsics::_fmaF:
|
||||
if (!InlineMathNatives || !UseFMA) return true;
|
||||
break;
|
||||
case vmIntrinsics::_arraycopy:
|
||||
if (!InlineArrayCopy) return true;
|
||||
break;
|
||||
|
@ -755,8 +755,10 @@
|
||||
do_class(java_lang_Math, "java/lang/Math") \
|
||||
do_class(java_lang_StrictMath, "java/lang/StrictMath") \
|
||||
do_signature(double2_double_signature, "(DD)D") \
|
||||
do_signature(double3_double_signature, "(DDD)D") \
|
||||
do_signature(float3_float_signature, "(FFF)F") \
|
||||
do_signature(int2_int_signature, "(II)I") \
|
||||
do_signature(long2_long_signature, "(JJ)J") \
|
||||
do_signature(long2_long_signature, "(JJ)J") \
|
||||
\
|
||||
/* here are the math names, all together: */ \
|
||||
do_name(abs_name,"abs") do_name(sin_name,"sin") do_name(cos_name,"cos") \
|
||||
@ -770,6 +772,7 @@
|
||||
do_name(multiplyExact_name,"multiplyExact") \
|
||||
do_name(negateExact_name,"negateExact") \
|
||||
do_name(subtractExact_name,"subtractExact") \
|
||||
do_name(fma_name, "fma") \
|
||||
\
|
||||
do_intrinsic(_dabs, java_lang_Math, abs_name, double_double_signature, F_S) \
|
||||
do_intrinsic(_dsin, java_lang_Math, sin_name, double_double_signature, F_S) \
|
||||
@ -795,6 +798,8 @@
|
||||
do_intrinsic(_negateExactL, java_lang_Math, negateExact_name, long_long_signature, F_S) \
|
||||
do_intrinsic(_subtractExactI, java_lang_Math, subtractExact_name, int2_int_signature, F_S) \
|
||||
do_intrinsic(_subtractExactL, java_lang_Math, subtractExact_name, long2_long_signature, F_S) \
|
||||
do_intrinsic(_fmaD, java_lang_Math, fma_name, double3_double_signature, F_S) \
|
||||
do_intrinsic(_fmaF, java_lang_Math, fma_name, float3_float_signature, F_S) \
|
||||
\
|
||||
do_intrinsic(_floatToRawIntBits, java_lang_Float, floatToRawIntBits_name, float_int_signature, F_S) \
|
||||
do_name( floatToRawIntBits_name, "floatToRawIntBits") \
|
||||
|
@ -258,16 +258,15 @@ class PushOrMarkClosure: public MetadataAwareOopClosure {
|
||||
// the closure ParMarkFromRootsClosure.
|
||||
class ParPushOrMarkClosure: public MetadataAwareOopClosure {
|
||||
private:
|
||||
CMSCollector* _collector;
|
||||
MemRegion _whole_span;
|
||||
MemRegion _span; // local chunk
|
||||
CMSBitMap* _bit_map;
|
||||
OopTaskQueue* _work_queue;
|
||||
CMSMarkStack* _overflow_stack;
|
||||
HeapWord* const _finger;
|
||||
HeapWord** const _global_finger_addr;
|
||||
ParMarkFromRootsClosure* const
|
||||
_parent;
|
||||
CMSCollector* _collector;
|
||||
MemRegion _whole_span;
|
||||
MemRegion _span; // local chunk
|
||||
CMSBitMap* _bit_map;
|
||||
OopTaskQueue* _work_queue;
|
||||
CMSMarkStack* _overflow_stack;
|
||||
HeapWord* const _finger;
|
||||
HeapWord* volatile* const _global_finger_addr;
|
||||
ParMarkFromRootsClosure* const _parent;
|
||||
protected:
|
||||
DO_OOP_WORK_DEFN
|
||||
public:
|
||||
@ -277,7 +276,7 @@ class ParPushOrMarkClosure: public MetadataAwareOopClosure {
|
||||
OopTaskQueue* work_queue,
|
||||
CMSMarkStack* mark_stack,
|
||||
HeapWord* finger,
|
||||
HeapWord** global_finger_addr,
|
||||
HeapWord* volatile* global_finger_addr,
|
||||
ParMarkFromRootsClosure* parent);
|
||||
virtual void do_oop(oop* p);
|
||||
virtual void do_oop(narrowOop* p);
|
||||
|
@ -3025,14 +3025,14 @@ class CMSConcMarkingTerminatorTerminator: public TerminatorTerminator {
|
||||
|
||||
// MT Concurrent Marking Task
|
||||
class CMSConcMarkingTask: public YieldingFlexibleGangTask {
|
||||
CMSCollector* _collector;
|
||||
uint _n_workers; // requested/desired # workers
|
||||
bool _result;
|
||||
CompactibleFreeListSpace* _cms_space;
|
||||
char _pad_front[64]; // padding to ...
|
||||
HeapWord* _global_finger; // ... avoid sharing cache line
|
||||
char _pad_back[64];
|
||||
HeapWord* _restart_addr;
|
||||
CMSCollector* _collector;
|
||||
uint _n_workers; // requested/desired # workers
|
||||
bool _result;
|
||||
CompactibleFreeListSpace* _cms_space;
|
||||
char _pad_front[64]; // padding to ...
|
||||
HeapWord* volatile _global_finger; // ... avoid sharing cache line
|
||||
char _pad_back[64];
|
||||
HeapWord* _restart_addr;
|
||||
|
||||
// Exposed here for yielding support
|
||||
Mutex* const _bit_map_lock;
|
||||
@ -3068,7 +3068,7 @@ class CMSConcMarkingTask: public YieldingFlexibleGangTask {
|
||||
|
||||
OopTaskQueue* work_queue(int i) { return task_queues()->queue(i); }
|
||||
|
||||
HeapWord** global_finger_addr() { return &_global_finger; }
|
||||
HeapWord* volatile* global_finger_addr() { return &_global_finger; }
|
||||
|
||||
CMSConcMarkingTerminator* terminator() { return &_term; }
|
||||
|
||||
@ -6554,7 +6554,7 @@ void ParMarkFromRootsClosure::scan_oops_in_oop(HeapWord* ptr) {
|
||||
|
||||
// Note: the local finger doesn't advance while we drain
|
||||
// the stack below, but the global finger sure can and will.
|
||||
HeapWord** gfa = _task->global_finger_addr();
|
||||
HeapWord* volatile* gfa = _task->global_finger_addr();
|
||||
ParPushOrMarkClosure pushOrMarkClosure(_collector,
|
||||
_span, _bit_map,
|
||||
_work_queue,
|
||||
@ -6721,7 +6721,7 @@ ParPushOrMarkClosure::ParPushOrMarkClosure(CMSCollector* collector,
|
||||
OopTaskQueue* work_queue,
|
||||
CMSMarkStack* overflow_stack,
|
||||
HeapWord* finger,
|
||||
HeapWord** global_finger_addr,
|
||||
HeapWord* volatile* global_finger_addr,
|
||||
ParMarkFromRootsClosure* parent) :
|
||||
MetadataAwareOopClosure(collector->ref_processor()),
|
||||
_collector(collector),
|
||||
|
@ -540,7 +540,7 @@ class CMSCollector: public CHeapObj<mtGC> {
|
||||
|
||||
// Overflow list of grey objects, threaded through mark-word
|
||||
// Manipulated with CAS in the parallel/multi-threaded case.
|
||||
oop _overflow_list;
|
||||
oopDesc* volatile _overflow_list;
|
||||
// The following array-pair keeps track of mark words
|
||||
// displaced for accommodating overflow list above.
|
||||
// This code will likely be revisited under RFE#4922830.
|
||||
@ -724,12 +724,12 @@ class CMSCollector: public CHeapObj<mtGC> {
|
||||
// Support for parallelizing young gen rescan in CMS remark phase
|
||||
ParNewGeneration* _young_gen;
|
||||
|
||||
HeapWord** _top_addr; // ... Top of Eden
|
||||
HeapWord** _end_addr; // ... End of Eden
|
||||
Mutex* _eden_chunk_lock;
|
||||
HeapWord** _eden_chunk_array; // ... Eden partitioning array
|
||||
size_t _eden_chunk_index; // ... top (exclusive) of array
|
||||
size_t _eden_chunk_capacity; // ... max entries in array
|
||||
HeapWord* volatile* _top_addr; // ... Top of Eden
|
||||
HeapWord** _end_addr; // ... End of Eden
|
||||
Mutex* _eden_chunk_lock;
|
||||
HeapWord** _eden_chunk_array; // ... Eden partitioning array
|
||||
size_t _eden_chunk_index; // ... top (exclusive) of array
|
||||
size_t _eden_chunk_capacity; // ... max entries in array
|
||||
|
||||
// Support for parallelizing survivor space rescan
|
||||
HeapWord** _survivor_chunk_array;
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2001, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2001, 2016, 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
|
||||
@ -323,7 +323,7 @@ class ParNewGeneration: public DefNewGeneration {
|
||||
// A list of from-space images of to-be-scanned objects, threaded through
|
||||
// klass-pointers (klass information already copied to the forwarded
|
||||
// image.) Manipulated with CAS.
|
||||
oop _overflow_list;
|
||||
oopDesc* volatile _overflow_list;
|
||||
NOT_PRODUCT(ssize_t _num_par_pushes;)
|
||||
|
||||
// This closure is used by the reference processor to filter out
|
||||
|
@ -2474,8 +2474,16 @@ size_t G1CollectedHeap::max_capacity() const {
|
||||
}
|
||||
|
||||
jlong G1CollectedHeap::millis_since_last_gc() {
|
||||
// assert(false, "NYI");
|
||||
return 0;
|
||||
// See the notes in GenCollectedHeap::millis_since_last_gc()
|
||||
// for more information about the implementation.
|
||||
jlong ret_val = (os::javaTimeNanos() / NANOSECS_PER_MILLISEC) -
|
||||
_g1_policy->collection_pause_end_millis();
|
||||
if (ret_val < 0) {
|
||||
log_warning(gc)("millis_since_last_gc() would return : " JLONG_FORMAT
|
||||
". returning zero instead.", ret_val);
|
||||
return 0;
|
||||
}
|
||||
return ret_val;
|
||||
}
|
||||
|
||||
void G1CollectedHeap::prepare_for_verify() {
|
||||
|
@ -66,7 +66,8 @@ G1DefaultPolicy::G1DefaultPolicy() :
|
||||
_phase_times(new G1GCPhaseTimes(ParallelGCThreads)),
|
||||
_tenuring_threshold(MaxTenuringThreshold),
|
||||
_max_survivor_regions(0),
|
||||
_survivors_age_table(true) { }
|
||||
_survivors_age_table(true),
|
||||
_collection_pause_end_millis(os::javaTimeNanos() / NANOSECS_PER_MILLISEC) { }
|
||||
|
||||
G1DefaultPolicy::~G1DefaultPolicy() {
|
||||
delete _ihop_control;
|
||||
@ -575,6 +576,8 @@ void G1DefaultPolicy::record_collection_pause_end(double pause_time_ms, size_t c
|
||||
|
||||
record_pause(young_gc_pause_kind(), end_time_sec - pause_time_ms / 1000.0, end_time_sec);
|
||||
|
||||
_collection_pause_end_millis = os::javaTimeNanos() / NANOSECS_PER_MILLISEC;
|
||||
|
||||
last_pause_included_initial_mark = collector_state()->during_initial_mark_pause();
|
||||
if (last_pause_included_initial_mark) {
|
||||
record_concurrent_mark_init_end(0.0);
|
||||
|
@ -64,6 +64,8 @@ class G1DefaultPolicy: public G1Policy {
|
||||
|
||||
double _full_collection_start_sec;
|
||||
|
||||
jlong _collection_pause_end_millis;
|
||||
|
||||
uint _young_list_target_length;
|
||||
uint _young_list_fixed_length;
|
||||
|
||||
@ -237,6 +239,8 @@ public:
|
||||
|
||||
double reclaimable_bytes_perc(size_t reclaimable_bytes) const;
|
||||
|
||||
jlong collection_pause_end_millis() { return _collection_pause_end_millis; }
|
||||
|
||||
private:
|
||||
// Sets up marking if proper conditions are met.
|
||||
void maybe_start_marking();
|
||||
|
@ -81,47 +81,6 @@ G1StaticIHOPControl::G1StaticIHOPControl(double ihop_percent) :
|
||||
_last_marking_length_s(0.0) {
|
||||
}
|
||||
|
||||
#ifndef PRODUCT
|
||||
static void test_update(G1IHOPControl* ctrl, double alloc_time, size_t alloc_amount, size_t young_size, double mark_time) {
|
||||
for (int i = 0; i < 100; i++) {
|
||||
ctrl->update_allocation_info(alloc_time, alloc_amount, young_size);
|
||||
ctrl->update_marking_length(mark_time);
|
||||
}
|
||||
}
|
||||
|
||||
void G1StaticIHOPControl::test() {
|
||||
size_t const initial_ihop = 45;
|
||||
|
||||
G1StaticIHOPControl ctrl(initial_ihop);
|
||||
ctrl.update_target_occupancy(100);
|
||||
|
||||
size_t threshold = ctrl.get_conc_mark_start_threshold();
|
||||
assert(threshold == initial_ihop,
|
||||
"Expected IHOP threshold of " SIZE_FORMAT " but is " SIZE_FORMAT, initial_ihop, threshold);
|
||||
|
||||
ctrl.update_allocation_info(100.0, 100, 100);
|
||||
threshold = ctrl.get_conc_mark_start_threshold();
|
||||
assert(threshold == initial_ihop,
|
||||
"Expected IHOP threshold of " SIZE_FORMAT " but is " SIZE_FORMAT, initial_ihop, threshold);
|
||||
|
||||
ctrl.update_marking_length(1000.0);
|
||||
threshold = ctrl.get_conc_mark_start_threshold();
|
||||
assert(threshold == initial_ihop,
|
||||
"Expected IHOP threshold of " SIZE_FORMAT " but is " SIZE_FORMAT, initial_ihop, threshold);
|
||||
|
||||
// Whatever we pass, the IHOP value must stay the same.
|
||||
test_update(&ctrl, 2, 10, 10, 3);
|
||||
threshold = ctrl.get_conc_mark_start_threshold();
|
||||
assert(threshold == initial_ihop,
|
||||
"Expected IHOP threshold of " SIZE_FORMAT " but is " SIZE_FORMAT, initial_ihop, threshold);
|
||||
|
||||
test_update(&ctrl, 12, 10, 10, 3);
|
||||
threshold = ctrl.get_conc_mark_start_threshold();
|
||||
assert(threshold == initial_ihop,
|
||||
"Expected IHOP threshold of " SIZE_FORMAT " but is " SIZE_FORMAT, initial_ihop, threshold);
|
||||
}
|
||||
#endif
|
||||
|
||||
G1AdaptiveIHOPControl::G1AdaptiveIHOPControl(double ihop_percent,
|
||||
G1Predictions const* predictor,
|
||||
size_t heap_reserve_percent,
|
||||
@ -224,79 +183,3 @@ void G1AdaptiveIHOPControl::send_trace_event(G1NewTracer* tracer) {
|
||||
_predictor->get_new_prediction(&_marking_times_s),
|
||||
have_enough_data_for_prediction());
|
||||
}
|
||||
|
||||
#ifndef PRODUCT
|
||||
void G1AdaptiveIHOPControl::test() {
|
||||
size_t const initial_threshold = 45;
|
||||
size_t const young_size = 10;
|
||||
size_t const target_size = 100;
|
||||
|
||||
// The final IHOP value is always
|
||||
// target_size - (young_size + alloc_amount/alloc_time * marking_time)
|
||||
|
||||
G1Predictions pred(0.95);
|
||||
G1AdaptiveIHOPControl ctrl(initial_threshold, &pred, 0, 0);
|
||||
ctrl.update_target_occupancy(target_size);
|
||||
|
||||
// First "load".
|
||||
size_t const alloc_time1 = 2;
|
||||
size_t const alloc_amount1 = 10;
|
||||
size_t const marking_time1 = 2;
|
||||
size_t const settled_ihop1 = target_size - (young_size + alloc_amount1/alloc_time1 * marking_time1);
|
||||
|
||||
size_t threshold;
|
||||
threshold = ctrl.get_conc_mark_start_threshold();
|
||||
assert(threshold == initial_threshold,
|
||||
"Expected IHOP threshold of " SIZE_FORMAT " but is " SIZE_FORMAT, initial_threshold, threshold);
|
||||
for (size_t i = 0; i < G1AdaptiveIHOPNumInitialSamples - 1; i++) {
|
||||
ctrl.update_allocation_info(alloc_time1, alloc_amount1, young_size);
|
||||
ctrl.update_marking_length(marking_time1);
|
||||
// Not enough data yet.
|
||||
threshold = ctrl.get_conc_mark_start_threshold();
|
||||
assert(threshold == initial_threshold,
|
||||
"Expected IHOP threshold of " SIZE_FORMAT " but is " SIZE_FORMAT, initial_threshold, threshold);
|
||||
}
|
||||
|
||||
test_update(&ctrl, alloc_time1, alloc_amount1, young_size, marking_time1);
|
||||
|
||||
threshold = ctrl.get_conc_mark_start_threshold();
|
||||
assert(threshold == settled_ihop1,
|
||||
"Expected IHOP threshold to settle at " SIZE_FORMAT " but is " SIZE_FORMAT, settled_ihop1, threshold);
|
||||
|
||||
// Second "load". A bit higher allocation rate.
|
||||
size_t const alloc_time2 = 2;
|
||||
size_t const alloc_amount2 = 30;
|
||||
size_t const marking_time2 = 2;
|
||||
size_t const settled_ihop2 = target_size - (young_size + alloc_amount2/alloc_time2 * marking_time2);
|
||||
|
||||
test_update(&ctrl, alloc_time2, alloc_amount2, young_size, marking_time2);
|
||||
|
||||
threshold = ctrl.get_conc_mark_start_threshold();
|
||||
assert(threshold < settled_ihop1,
|
||||
"Expected IHOP threshold to settle at a value lower than " SIZE_FORMAT " but is " SIZE_FORMAT, settled_ihop1, threshold);
|
||||
|
||||
// Third "load". Very high (impossible) allocation rate.
|
||||
size_t const alloc_time3 = 1;
|
||||
size_t const alloc_amount3 = 50;
|
||||
size_t const marking_time3 = 2;
|
||||
size_t const settled_ihop3 = 0;
|
||||
|
||||
test_update(&ctrl, alloc_time3, alloc_amount3, young_size, marking_time3);
|
||||
threshold = ctrl.get_conc_mark_start_threshold();
|
||||
|
||||
assert(threshold == settled_ihop3,
|
||||
"Expected IHOP threshold to settle at " SIZE_FORMAT " but is " SIZE_FORMAT, settled_ihop3, threshold);
|
||||
|
||||
// And back to some arbitrary value.
|
||||
test_update(&ctrl, alloc_time2, alloc_amount2, young_size, marking_time2);
|
||||
|
||||
threshold = ctrl.get_conc_mark_start_threshold();
|
||||
assert(threshold > settled_ihop3,
|
||||
"Expected IHOP threshold to settle at value larger than " SIZE_FORMAT " but is " SIZE_FORMAT, settled_ihop3, threshold);
|
||||
}
|
||||
|
||||
void IHOP_test() {
|
||||
G1StaticIHOPControl::test();
|
||||
G1AdaptiveIHOPControl::test();
|
||||
}
|
||||
#endif
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2015, 2016, 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
|
||||
@ -99,10 +99,6 @@ class G1StaticIHOPControl : public G1IHOPControl {
|
||||
assert(marking_length_s > 0.0, "Marking length must be larger than zero but is %.3f", marking_length_s);
|
||||
_last_marking_length_s = marking_length_s;
|
||||
}
|
||||
|
||||
#ifndef PRODUCT
|
||||
static void test();
|
||||
#endif
|
||||
};
|
||||
|
||||
// This algorithm tries to return a concurrent mark starting occupancy value that
|
||||
@ -148,9 +144,6 @@ class G1AdaptiveIHOPControl : public G1IHOPControl {
|
||||
|
||||
virtual void print();
|
||||
virtual void send_trace_event(G1NewTracer* tracer);
|
||||
#ifndef PRODUCT
|
||||
static void test();
|
||||
#endif
|
||||
};
|
||||
|
||||
#endif // SHARE_VM_GC_G1_G1IHOPCONTROL_HPP
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user