Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
dragonwell11
提交
dd5257d5
D
dragonwell11
项目概览
openanolis
/
dragonwell11
通知
7
Star
2
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
D
dragonwell11
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
dd5257d5
编写于
7月 05, 2017
作者:
D
duke
浏览文件
操作
浏览文件
下载
差异文件
Merge
上级
e06a0783
5a3294cb
变更
74
展开全部
隐藏空白更改
内联
并排
Showing
74 changed file
with
2966 addition
and
1734 deletion
+2966
-1734
.hgtags-top-repo
.hgtags-top-repo
+1
-0
common/autoconf/basics.m4
common/autoconf/basics.m4
+10
-0
common/autoconf/compare.sh.in
common/autoconf/compare.sh.in
+44
-37
common/autoconf/generated-configure.sh
common/autoconf/generated-configure.sh
+200
-1
common/autoconf/spec.gmk.in
common/autoconf/spec.gmk.in
+6
-0
common/bin/compare.sh
common/bin/compare.sh
+36
-31
hotspot/.hgtags
hotspot/.hgtags
+1
-0
hotspot/src/cpu/aarch64/vm/aarch64.ad
hotspot/src/cpu/aarch64/vm/aarch64.ad
+42
-83
hotspot/src/cpu/aarch64/vm/macroAssembler_aarch64.hpp
hotspot/src/cpu/aarch64/vm/macroAssembler_aarch64.hpp
+19
-0
hotspot/src/cpu/x86/vm/assembler_x86.cpp
hotspot/src/cpu/x86/vm/assembler_x86.cpp
+750
-524
hotspot/src/cpu/x86/vm/assembler_x86.hpp
hotspot/src/cpu/x86/vm/assembler_x86.hpp
+43
-17
hotspot/src/cpu/x86/vm/c1_LIRAssembler_x86.cpp
hotspot/src/cpu/x86/vm/c1_LIRAssembler_x86.cpp
+14
-6
hotspot/src/cpu/x86/vm/c1_Runtime1_x86.cpp
hotspot/src/cpu/x86/vm/c1_Runtime1_x86.cpp
+42
-99
hotspot/src/cpu/x86/vm/macroAssembler_x86.cpp
hotspot/src/cpu/x86/vm/macroAssembler_x86.cpp
+224
-108
hotspot/src/cpu/x86/vm/macroAssembler_x86.hpp
hotspot/src/cpu/x86/vm/macroAssembler_x86.hpp
+3
-0
hotspot/src/cpu/x86/vm/sharedRuntime_x86_32.cpp
hotspot/src/cpu/x86/vm/sharedRuntime_x86_32.cpp
+89
-124
hotspot/src/cpu/x86/vm/sharedRuntime_x86_64.cpp
hotspot/src/cpu/x86/vm/sharedRuntime_x86_64.cpp
+80
-233
hotspot/src/cpu/x86/vm/stubGenerator_x86_32.cpp
hotspot/src/cpu/x86/vm/stubGenerator_x86_32.cpp
+50
-2
hotspot/src/cpu/x86/vm/stubGenerator_x86_64.cpp
hotspot/src/cpu/x86/vm/stubGenerator_x86_64.cpp
+67
-13
hotspot/src/cpu/x86/vm/stubRoutines_x86_32.hpp
hotspot/src/cpu/x86/vm/stubRoutines_x86_32.hpp
+1
-1
hotspot/src/cpu/x86/vm/stubRoutines_x86_64.hpp
hotspot/src/cpu/x86/vm/stubRoutines_x86_64.hpp
+1
-1
hotspot/src/cpu/x86/vm/vm_version_x86.cpp
hotspot/src/cpu/x86/vm/vm_version_x86.cpp
+8
-12
hotspot/src/cpu/x86/vm/vm_version_x86.hpp
hotspot/src/cpu/x86/vm/vm_version_x86.hpp
+16
-8
hotspot/src/cpu/x86/vm/x86.ad
hotspot/src/cpu/x86/vm/x86.ad
+271
-93
hotspot/src/cpu/x86/vm/x86_32.ad
hotspot/src/cpu/x86/vm/x86_32.ad
+4
-4
hotspot/src/cpu/x86/vm/x86_64.ad
hotspot/src/cpu/x86/vm/x86_64.ad
+4
-4
hotspot/src/os/linux/vm/os_linux.cpp
hotspot/src/os/linux/vm/os_linux.cpp
+26
-6
hotspot/src/os/windows/vm/os_windows.cpp
hotspot/src/os/windows/vm/os_windows.cpp
+20
-0
hotspot/src/share/vm/adlc/formssel.cpp
hotspot/src/share/vm/adlc/formssel.cpp
+1
-0
hotspot/src/share/vm/gc/cms/concurrentMarkSweepGeneration.cpp
...pot/src/share/vm/gc/cms/concurrentMarkSweepGeneration.cpp
+1
-2
hotspot/src/share/vm/gc/g1/collectionSetChooser.cpp
hotspot/src/share/vm/gc/g1/collectionSetChooser.cpp
+23
-15
hotspot/src/share/vm/gc/g1/collectionSetChooser.hpp
hotspot/src/share/vm/gc/g1/collectionSetChooser.hpp
+17
-17
hotspot/src/share/vm/gc/g1/concurrentG1Refine.cpp
hotspot/src/share/vm/gc/g1/concurrentG1Refine.cpp
+27
-10
hotspot/src/share/vm/gc/g1/concurrentG1Refine.hpp
hotspot/src/share/vm/gc/g1/concurrentG1Refine.hpp
+6
-1
hotspot/src/share/vm/gc/g1/g1CollectedHeap.cpp
hotspot/src/share/vm/gc/g1/g1CollectedHeap.cpp
+54
-87
hotspot/src/share/vm/gc/g1/g1CollectedHeap.hpp
hotspot/src/share/vm/gc/g1/g1CollectedHeap.hpp
+7
-15
hotspot/src/share/vm/gc/g1/g1CollectedHeap_ext.cpp
hotspot/src/share/vm/gc/g1/g1CollectedHeap_ext.cpp
+0
-4
hotspot/src/share/vm/gc/g1/g1CollectorPolicy.cpp
hotspot/src/share/vm/gc/g1/g1CollectorPolicy.cpp
+20
-20
hotspot/src/share/vm/gc/g1/g1CollectorPolicy.hpp
hotspot/src/share/vm/gc/g1/g1CollectorPolicy.hpp
+6
-5
hotspot/src/share/vm/gc/g1/g1EvacStats.cpp
hotspot/src/share/vm/gc/g1/g1EvacStats.cpp
+5
-5
hotspot/src/share/vm/gc/g1/g1ParScanThreadState.cpp
hotspot/src/share/vm/gc/g1/g1ParScanThreadState.cpp
+52
-8
hotspot/src/share/vm/gc/g1/g1ParScanThreadState.hpp
hotspot/src/share/vm/gc/g1/g1ParScanThreadState.hpp
+47
-1
hotspot/src/share/vm/gc/g1/g1ParScanThreadState_ext.cpp
hotspot/src/share/vm/gc/g1/g1ParScanThreadState_ext.cpp
+31
-0
hotspot/src/share/vm/gc/g1/g1RemSet.cpp
hotspot/src/share/vm/gc/g1/g1RemSet.cpp
+10
-25
hotspot/src/share/vm/gc/g1/g1RemSet.hpp
hotspot/src/share/vm/gc/g1/g1RemSet.hpp
+9
-10
hotspot/src/share/vm/gc/parallel/parallelScavengeHeap.hpp
hotspot/src/share/vm/gc/parallel/parallelScavengeHeap.hpp
+1
-1
hotspot/src/share/vm/gc/serial/defNewGeneration.cpp
hotspot/src/share/vm/gc/serial/defNewGeneration.cpp
+1
-1
hotspot/src/share/vm/gc/serial/tenuredGeneration.cpp
hotspot/src/share/vm/gc/serial/tenuredGeneration.cpp
+1
-2
hotspot/src/share/vm/gc/shared/ageTable.cpp
hotspot/src/share/vm/gc/shared/ageTable.cpp
+0
-7
hotspot/src/share/vm/gc/shared/ageTable.hpp
hotspot/src/share/vm/gc/shared/ageTable.hpp
+0
-1
hotspot/src/share/vm/gc/shared/blockOffsetTable.cpp
hotspot/src/share/vm/gc/shared/blockOffsetTable.cpp
+8
-1
hotspot/src/share/vm/gc/shared/genCollectedHeap.cpp
hotspot/src/share/vm/gc/shared/genCollectedHeap.cpp
+9
-10
hotspot/src/share/vm/gc/shared/genCollectedHeap.hpp
hotspot/src/share/vm/gc/shared/genCollectedHeap.hpp
+1
-1
hotspot/src/share/vm/opto/classes.hpp
hotspot/src/share/vm/opto/classes.hpp
+1
-0
hotspot/src/share/vm/opto/ifnode.cpp
hotspot/src/share/vm/opto/ifnode.cpp
+35
-11
hotspot/src/share/vm/opto/loopPredicate.cpp
hotspot/src/share/vm/opto/loopPredicate.cpp
+7
-0
hotspot/src/share/vm/opto/loopnode.cpp
hotspot/src/share/vm/opto/loopnode.cpp
+1
-1
hotspot/src/share/vm/opto/superword.cpp
hotspot/src/share/vm/opto/superword.cpp
+5
-0
hotspot/src/share/vm/opto/vectornode.cpp
hotspot/src/share/vm/opto/vectornode.cpp
+6
-0
hotspot/src/share/vm/opto/vectornode.hpp
hotspot/src/share/vm/opto/vectornode.hpp
+8
-0
hotspot/src/share/vm/prims/whitebox.cpp
hotspot/src/share/vm/prims/whitebox.cpp
+16
-5
hotspot/src/share/vm/services/lowMemoryDetector.cpp
hotspot/src/share/vm/services/lowMemoryDetector.cpp
+20
-14
hotspot/src/share/vm/services/lowMemoryDetector.hpp
hotspot/src/share/vm/services/lowMemoryDetector.hpp
+2
-2
hotspot/test/compiler/arraycopy/TestEliminatedArrayLoopPredicateCopyDeopt.java
.../arraycopy/TestEliminatedArrayLoopPredicateCopyDeopt.java
+53
-0
hotspot/test/compiler/loopopts/superword/SumRedSqrt_Double.java
...t/test/compiler/loopopts/superword/SumRedSqrt_Double.java
+95
-0
hotspot/test/compiler/rangechecks/TestBadFoldCompare.java
hotspot/test/compiler/rangechecks/TestBadFoldCompare.java
+59
-1
hotspot/test/gc/g1/humongousObjects/TestHumongousThreshold.java
...t/test/gc/g1/humongousObjects/TestHumongousThreshold.java
+2
-2
hotspot/test/serviceability/dcmd/compiler/CodelistTest.java
hotspot/test/serviceability/dcmd/compiler/CodelistTest.java
+3
-0
hotspot/test/testlibrary/jdk/test/lib/Utils.java
hotspot/test/testlibrary/jdk/test/lib/Utils.java
+24
-0
hotspot/test/testlibrary_tests/whitebox/BlobSanityTest.java
hotspot/test/testlibrary_tests/whitebox/BlobSanityTest.java
+60
-0
make/Init.gmk
make/Init.gmk
+55
-12
make/InitSupport.gmk
make/InitSupport.gmk
+58
-3
make/common/JavaCompilation.gmk
make/common/JavaCompilation.gmk
+34
-19
make/common/NativeCompilation.gmk
make/common/NativeCompilation.gmk
+13
-8
未找到文件。
.hgtags-top-repo
浏览文件 @
dd5257d5
...
...
@@ -325,3 +325,4 @@ ba08a9f79b9849716bae1f39f71333d47f604012 jdk9-b79
f7c5ae2933c0b8510a420d1713a955e4ffc7ad0b jdk9-b80
b8afcf91331d78626a583ec1b63164468d6f4181 jdk9-b81
42b56d1f418523ecb61a49d7493302c80c8009cc jdk9-b82
ce5c14d97d95084504c32b9320cb33cce4235588 jdk9-b83
common/autoconf/basics.m4
浏览文件 @
dd5257d5
...
...
@@ -445,6 +445,15 @@ AC_DEFUN_ONCE([BASIC_SETUP_PATHS],
# Save the current directory this script was started from
CURDIR="$PWD"
# We might need to rewrite ORIGINAL_PATH, if it includes "#", to quote them
# for make. We couldn't do this when we retrieved ORIGINAL_PATH, since SED
# was not available at that time.
REWRITTEN_PATH=`$ECHO "$ORIGINAL_PATH" | $SED -e 's/#/\\\\#/g'`
if test "x$REWRITTEN_PATH" != "x$ORIGINAL_PATH"; then
ORIGINAL_PATH="$REWRITTEN_PATH"
AC_MSG_NOTICE([Rewriting ORIGINAL_PATH to $REWRITTEN_PATH])
fi
if test "x$OPENJDK_TARGET_OS" = "xwindows"; then
PATH_SEP=";"
BASIC_CHECK_PATHS_WINDOWS
...
...
@@ -935,6 +944,7 @@ AC_DEFUN_ONCE([BASIC_SETUP_COMPLEX_TOOLS],
BASIC_PATH_PROGS(HG, hg)
BASIC_PATH_PROGS(STAT, stat)
BASIC_PATH_PROGS(TIME, time)
BASIC_PATH_PROGS(PATCH, [gpatch patch])
# Check if it's GNU time
IS_GNU_TIME=`$TIME --version 2>&1 | $GREP 'GNU time'`
if test "x$IS_GNU_TIME" != x; then
...
...
common/autoconf/compare.sh.in
浏览文件 @
dd5257d5
...
...
@@ -29,47 +29,50 @@
##########################################################################################
# Substitutions from autoconf
LEGACY_BUILD_DIR
=
@OPENJDK_TARGET_OS@-@OPENJDK_TARGET_CPU_LEGACY@
export
LEGACY_BUILD_DIR
=
@OPENJDK_TARGET_OS@-@OPENJDK_TARGET_CPU_LEGACY@
OPENJDK_TARGET_OS
=
"@OPENJDK_TARGET_OS@"
OPENJDK_TARGET_CPU
=
"@OPENJDK_TARGET_CPU@"
export
OPENJDK_TARGET_OS
=
"@OPENJDK_TARGET_OS@"
export
OPENJDK_TARGET_CPU
=
"@OPENJDK_TARGET_CPU@"
AWK
=
"@AWK@"
CAT
=
"@CAT@"
CMP
=
"@CMP@"
CP
=
"@CP@"
CUT
=
"@CUT@"
DIFF
=
"@DIFF@"
DUMPBIN
=
"@FIXPATH@ @DUMPBIN@"
EXPR
=
"@EXPR@"
FILE
=
"@FILE@"
FIND
=
"@FIND@"
GREP
=
"@GREP@"
JAVAP
=
"@FIXPATH@ @BOOT_JDK@/bin/javap @JAVA_TOOL_FLAGS_SMALL@"
JIMAGE
=
"@FIXPATH@ @BUILD_OUTPUT@/jdk/bin/jimage"
LDD
=
"@LDD@"
LN
=
"@LN@"
MKDIR
=
"@MKDIR@"
NAWK
=
"@NAWK@"
NM
=
"@GNM@"
OBJDUMP
=
"@OBJDUMP@"
OTOOL
=
"@OTOOL@"
PRINTF
=
"@PRINTF@"
READELF
=
"@READELF@"
RM
=
"@RM@"
SED
=
"@SED@"
SORT
=
"@SORT@"
STAT
=
"@STAT@"
STRIP
=
"@POST_STRIP_CMD@"
TEE
=
"@TEE@"
UNIQ
=
"@UNIQ@"
UNPACK200
=
"@FIXPATH@ @BOOT_JDK@/bin/unpack200"
UNZIP
=
"@UNZIP@"
export
AWK
=
"@AWK@"
export
BASH
=
"@BASH@"
export
CAT
=
"@CAT@"
export
CMP
=
"@CMP@"
export
CP
=
"@CP@"
export
CUT
=
"@CUT@"
export
DIFF
=
"@DIFF@"
export
DUMPBIN
=
"@FIXPATH@ @DUMPBIN@"
export
EXPR
=
"@EXPR@"
export
FILE
=
"@FILE@"
export
FIND
=
"@FIND@"
export
GREP
=
"@GREP@"
export
JAVAP
=
"@FIXPATH@ @BOOT_JDK@/bin/javap @JAVA_TOOL_FLAGS_SMALL@"
export
JIMAGE
=
"@FIXPATH@ @BUILD_OUTPUT@/jdk/bin/jimage"
export
LDD
=
"@LDD@"
export
LN
=
"@LN@"
export
MKDIR
=
"@MKDIR@"
export
MV
=
"@MV@"
export
NAWK
=
"@NAWK@"
export
NM
=
"@GNM@"
export
OBJDUMP
=
"@OBJDUMP@"
export
OTOOL
=
"@OTOOL@"
export
PRINTF
=
"@PRINTF@"
export
READELF
=
"@READELF@"
export
RM
=
"@RM@"
export
SED
=
"@SED@"
export
SORT
=
"@SORT@"
export
STAT
=
"@STAT@"
export
STRIP
=
"@POST_STRIP_CMD@"
export
TEE
=
"@TEE@"
export
UNIQ
=
"@UNIQ@"
export
UNPACK200
=
"@FIXPATH@ @BOOT_JDK@/bin/unpack200"
export
UNZIP
=
"@UNZIP@"
SRC_ROOT
=
"@TOPDIR@"
export
SRC_ROOT
=
"@TOPDIR@"
export
OUTPUT_ROOT
=
"@OUTPUT_ROOT@"
if
[
"
$OPENJDK_TARGET_OS
"
=
"windows"
]
;
then
PATH
=
"@VS_PATH@"
export
PATH
=
"@VS_PATH@"
fi
# Now locate the main script and run it.
...
...
@@ -79,4 +82,8 @@ if [ ! -e "$REAL_COMPARE_SCRIPT" ]; then
exit
1
fi
.
"
$REAL_COMPARE_SCRIPT
"
"
$@
"
# Rotate logs
$RM
$OUTPUT_ROOT
/compare.log.old 2> /dev/null
$MV
$OUTPUT_ROOT
/compare.log
$OUTPUT_ROOT
/compare.log.old 2> /dev/null
$BASH
$SRC_ROOT
/common/bin/logger.sh
$OUTPUT_ROOT
/compare.log
$BASH
"
$REAL_COMPARE_SCRIPT
"
"
$@
"
common/autoconf/generated-configure.sh
浏览文件 @
dd5257d5
...
...
@@ -859,6 +859,7 @@ CODESIGN
XATTR
DSYMUTIL
IS_GNU_TIME
PATCH
TIME
STAT
HG
...
...
@@ -1174,6 +1175,7 @@ READELF
HG
STAT
TIME
PATCH
DSYMUTIL
XATTR
CODESIGN
...
...
@@ -2053,6 +2055,7 @@ Some influential environment variables:
HG Override default value for HG
STAT Override default value for STAT
TIME Override default value for TIME
PATCH Override default value for PATCH
DSYMUTIL Override default value for DSYMUTIL
XATTR Override default value for XATTR
CODESIGN Override default value for CODESIGN
...
...
@@ -4359,7 +4362,7 @@ VS_SDK_PLATFORM_NAME_2013=
#CUSTOM_AUTOCONF_INCLUDE
# Do not change or remove the following line, it is needed for consistency checks:
DATE_WHEN_GENERATED=144
1958217
DATE_WHEN_GENERATED=144
2820958
###############################################################################
#
...
...
@@ -13841,6 +13844,16 @@ $as_echo "$COMPILE_TYPE" >&6; }
# Save the current directory this script was started from
CURDIR="$PWD"
# We might need to rewrite ORIGINAL_PATH, if it includes "#", to quote them
# for make. We couldn't do this when we retrieved ORIGINAL_PATH, since SED
# was not available at that time.
REWRITTEN_PATH=`$ECHO "$ORIGINAL_PATH" | $SED -e 's/#/\\\\#/g'`
if test "x$REWRITTEN_PATH" != "x$ORIGINAL_PATH"; then
ORIGINAL_PATH="$REWRITTEN_PATH"
{ $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting ORIGINAL_PATH to $REWRITTEN_PATH" >&5
$as_echo "$as_me: Rewriting ORIGINAL_PATH to $REWRITTEN_PATH" >&6;}
fi
if test "x$OPENJDK_TARGET_OS" = "xwindows"; then
PATH_SEP=";"
...
...
@@ -18865,6 +18878,192 @@ $as_echo "$tool_specified" >&6; }
fi
# Publish this variable in the help.
if test "x$PATCH" = x; then
# The variable is not set by user, try to locate tool using the code snippet
for ac_prog in gpatch patch
do
# Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_path_PATCH+:} false; then :
$as_echo_n "(cached) " >&6
else
case $PATCH in
[\\/]* | ?:[\\/]*)
ac_cv_path_PATCH="$PATCH" # Let the user override the test with a path.
;;
*)
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_path_PATCH="$as_dir/$ac_word$ac_exec_ext"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
fi
done
done
IFS=$as_save_IFS
;;
esac
fi
PATCH=$ac_cv_path_PATCH
if test -n "$PATCH"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $PATCH" >&5
$as_echo "$PATCH" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
test -n "$PATCH" && break
done
else
# The variable is set, but is it from the command line or the environment?
# Try to remove the string !PATCH! from our list.
try_remove_var=${CONFIGURE_OVERRIDDEN_VARIABLES//!PATCH!/}
if test "x$try_remove_var" = "x$CONFIGURE_OVERRIDDEN_VARIABLES"; then
# If it failed, the variable was not from the command line. Ignore it,
# but warn the user (except for BASH, which is always set by the calling BASH).
if test "xPATCH" != xBASH; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Ignoring value of PATCH from the environment. Use command line variables instead." >&5
$as_echo "$as_me: WARNING: Ignoring value of PATCH from the environment. Use command line variables instead." >&2;}
fi
# Try to locate tool using the code snippet
for ac_prog in gpatch patch
do
# Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_path_PATCH+:} false; then :
$as_echo_n "(cached) " >&6
else
case $PATCH in
[\\/]* | ?:[\\/]*)
ac_cv_path_PATCH="$PATCH" # Let the user override the test with a path.
;;
*)
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_path_PATCH="$as_dir/$ac_word$ac_exec_ext"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
fi
done
done
IFS=$as_save_IFS
;;
esac
fi
PATCH=$ac_cv_path_PATCH
if test -n "$PATCH"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $PATCH" >&5
$as_echo "$PATCH" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
test -n "$PATCH" && break
done
else
# If it succeeded, then it was overridden by the user. We will use it
# for the tool.
# First remove it from the list of overridden variables, so we can test
# for unknown variables in the end.
CONFIGURE_OVERRIDDEN_VARIABLES="$try_remove_var"
# Check if the provided tool contains a complete path.
tool_specified="$PATCH"
tool_basename="${tool_specified##*/}"
if test "x$tool_basename" = "x$tool_specified"; then
# A command without a complete path is provided, search $PATH.
{ $as_echo "$as_me:${as_lineno-$LINENO}: Will search for user supplied tool PATCH=$tool_basename" >&5
$as_echo "$as_me: Will search for user supplied tool PATCH=$tool_basename" >&6;}
# Extract the first word of "$tool_basename", so it can be a program name with args.
set dummy $tool_basename; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_path_PATCH+:} false; then :
$as_echo_n "(cached) " >&6
else
case $PATCH in
[\\/]* | ?:[\\/]*)
ac_cv_path_PATCH="$PATCH" # Let the user override the test with a path.
;;
*)
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_path_PATCH="$as_dir/$ac_word$ac_exec_ext"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
fi
done
done
IFS=$as_save_IFS
;;
esac
fi
PATCH=$ac_cv_path_PATCH
if test -n "$PATCH"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $PATCH" >&5
$as_echo "$PATCH" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
if test "x$PATCH" = x; then
as_fn_error $? "User supplied tool $tool_basename could not be found" "$LINENO" 5
fi
else
# Otherwise we believe it is a complete path. Use it as it is.
{ $as_echo "$as_me:${as_lineno-$LINENO}: Will use user supplied tool PATCH=$tool_specified" >&5
$as_echo "$as_me: Will use user supplied tool PATCH=$tool_specified" >&6;}
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for PATCH" >&5
$as_echo_n "checking for PATCH... " >&6; }
if test ! -x "$tool_specified"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
$as_echo "not found" >&6; }
as_fn_error $? "User supplied tool PATCH=$tool_specified does not exist or is not executable" "$LINENO" 5
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $tool_specified" >&5
$as_echo "$tool_specified" >&6; }
fi
fi
fi
# Check if it's GNU time
IS_GNU_TIME=`$TIME --version 2>&1 | $GREP 'GNU time'`
if test "x$IS_GNU_TIME" != x; then
common/autoconf/spec.gmk.in
浏览文件 @
dd5257d5
...
...
@@ -36,6 +36,11 @@ CONFIGURE_COMMAND_LINE:=@CONFIGURE_COMMAND_LINE@
# A self-referential reference to this file.
SPEC:=@SPEC@
# SPACE is defined in MakeBase.gmk, but it is also used in := rules here for some
# toolchains, and is needed if MakeBase.gmk is not included before this file.
X:=
SPACE:=$(X) $(X)
# What make to use for main processing, after bootstrapping top-level Makefile.
MAKE := @MAKE@
...
...
@@ -495,6 +500,7 @@ LN:=@LN@
MKDIR:=@MKDIR@
MV:=@MV@
NAWK:=@NAWK@
PATCH:=@PATCH@
PRINTF:=@PRINTF@
PWD:=@THEPWDCMD@
RM:=@RM@
...
...
common/bin/compare.sh
浏览文件 @
dd5257d5
...
...
@@ -88,23 +88,19 @@ diff_text() {
TMP
=
$(
LC_ALL
=
C
$DIFF
$OTHER_FILE
$THIS_FILE
|
\
$GREP
'^[<>]'
|
\
$SED
-e
'/[<>] \* from.*\.idl/d'
\
-e
'/[<>]
\*
.*[0-9]\{4\}_[0-9]\{2\}_[0-9]\{2\}_[0-9]\{2\}_[0-9]\{2\}-b[0-9]\{2\}.*/d'
\
-e
'/[<>] .*[0-9]\{4\}_[0-9]\{2\}_[0-9]\{2\}_[0-9]\{2\}_[0-9]\{2\}-b[0-9]\{2\}.*/d'
\
-e
'/[<>] \*.*[0-9]\{4\} [0-9][0-9]*:[0-9]\{2\}:[0-9]\{2\}.*/d'
\
-e
'/\/\/ Generated from input file.*/d'
\
-e
'/\/\/ This file was generated AUTOMATICALLY from a template file.*/d'
\
-e
'/\/\/ java GenerateCharacter.*/d'
)
fi
# Ignore date strings in class files.
# On Macosx the system sources for generated java classes produce different output on
# consequtive invocations seemingly randomly.
# For example a method parameter randomly named "thePoint" or "aPoint". Ignore this.
# Anonymous lambda classes get randomly assigned counters in their names.
if
test
"x
$SUFFIX
"
=
"xclass"
;
then
# To improve performance when large diffs are found, do a rough filtering of classes
# elibeble for these exceptions
if
$GREP
-R
-e
'[0-9]\{4\}_[0-9]\{2\}_[0-9]\{2\}_[0-9]\{2\}_[0-9]\{2\}-b[0-9]\{2\}'
\
-e
'[0-9]\{2\}/[0-9]\{2\}/[0-9]\{4\}'
\
-e
thePoint
-e
aPoint
-e
setItemsPtr
\
-e
'lambda\$[a-zA-Z0-9]*\$[0-9]'
${
THIS_FILE
}
>
/dev/null
;
then
$JAVAP
-c
-constants
-l
-p
"
${
OTHER_FILE
}
"
>
${
OTHER_FILE
}
.javap
$JAVAP
-c
-constants
-l
-p
"
${
THIS_FILE
}
"
>
${
THIS_FILE
}
.javap
...
...
@@ -112,9 +108,6 @@ diff_text() {
$GREP
'^[<>]'
|
\
$SED
-e
'/[<>].*[0-9]\{4\}_[0-9]\{2\}_[0-9]\{2\}_[0-9]\{2\}_[0-9]\{2\}-b[0-9]\{2\}.*/d'
\
-e
'/[0-9]\{2\}\/[0-9]\{2\}\/[0-9]\{4\}/d'
\
-e
'/[<>].*Point Lcom\/apple\/jobjc\/foundation\/NSPoint;/d'
\
-e
'/[<>].*public com\.apple\.jobjc\.Pointer<com\.apple\.jobjc\..*itemsPtr();/d'
\
-e
'/[<>].*public void setItemsPtr(com\.apple\.jobjc\.Pointer<com\.apple\.jobjc\..*);/d'
\
-e
'/[<>].*lambda\$[a-zA-Z0-9]*\$[0-9]*/d'
)
fi
fi
...
...
@@ -313,7 +306,7 @@ compare_general_files() {
!
-name
"jspawnhelper"
\
|
$GREP
-v
"./bin/"
|
$SORT
|
$FILTER
)
echo
General fil
es...
echo
Other files with binary differenc
es...
for
f
in
$GENERAL_FILES
do
if
[
-e
$OTHER_DIR
/
$f
]
;
then
...
...
@@ -590,7 +583,7 @@ compare_bin_file() {
ORIG_THIS_FILE
=
"
$THIS_FILE
"
ORIG_OTHER_FILE
=
"
$OTHER_FILE
"
if
[[
"
$STRIP_BEFORE_COMPARE
"
=
*
"
$BIN_FILE
"
*
]]
;
then
if
[
"
$STRIP_ALL
"
=
"true"
]
||
[
[
"
$STRIP_BEFORE_COMPARE
"
=
*
"
$BIN_FILE
"
*
]]
;
then
THIS_STRIPPED_FILE
=
$FILE_WORK_DIR
/this/
$NAME
OTHER_STRIPPED_FILE
=
$FILE_WORK_DIR
/other/
$NAME
$MKDIR
-p
$FILE_WORK_DIR
/this
$FILE_WORK_DIR
/other
...
...
@@ -722,7 +715,7 @@ compare_bin_file() {
fi
fi
if
[[
"
$SORT_SYMBOLS
"
=
*
"
$BIN_FILE
"
*
]]
;
then
if
[
"
$SORT_ALL_SYMBOLS
"
=
"true"
]
||
[
[
"
$SORT_SYMBOLS
"
=
*
"
$BIN_FILE
"
*
]]
;
then
SYM_SORT_CMD
=
"sort"
else
SYM_SORT_CMD
=
"cat"
...
...
@@ -810,31 +803,34 @@ compare_bin_file() {
if
[
-z
"
$FULLDUMP_DIFF_FILTER
"
]
;
then
FULLDUMP_DIFF_FILTER
=
"
$CAT
"
fi
$FULLDUMP_CMD
$OTHER_FILE
|
eval
"
$FULLDUMP_DIFF_FILTER
"
>
$WORK_FILE_BASE
.fulldump.other 2>&1
$FULLDUMP_CMD
$THIS_FILE
|
eval
"
$FULLDUMP_DIFF_FILTER
"
>
$WORK_FILE_BASE
.fulldump.this 2>&1
$FULLDUMP_CMD
$OTHER_FILE
|
eval
"
$FULLDUMP_DIFF_FILTER
"
\
>
$WORK_FILE_BASE
.fulldump.other 2>&1
$FULLDUMP_CMD
$THIS_FILE
|
eval
"
$FULLDUMP_DIFF_FILTER
"
\
>
$WORK_FILE_BASE
.fulldump.this 2>&1
LC_ALL
=
C
$DIFF
$WORK_FILE_BASE
.fulldump.other
$WORK_FILE_BASE
.fulldump.this
>
$WORK_FILE_BASE
.fulldump.diff
LC_ALL
=
C
$DIFF
$WORK_FILE_BASE
.fulldump.other
$WORK_FILE_BASE
.fulldump.this
\
>
$WORK_FILE_BASE
.fulldump.diff
if
[
-s
$WORK_FILE_BASE
.fulldump.diff
]
;
then
ELF
_DIFF_SIZE
=
$(
ls
-n
$WORK_FILE_BASE
.fulldump.diff |
awk
'{print $5}'
)
ELF_MSG
=
$(
$PRINTF
"%8d"
$ELF
_DIFF_SIZE
)
if
[[
"
$ACCEPTED_
ELF
_DIFF
"
!=
*
"
$BIN_FILE
"
*
]]
;
then
DIFF_
ELF
=
true
if
[[
"
$KNOWN_
ELF
_DIFF
"
!=
*
"
$BIN_FILE
"
*
]]
;
then
ELF_MSG
=
"*
$ELF
_MSG
*"
FULLDUMP
_DIFF_SIZE
=
$(
ls
-n
$WORK_FILE_BASE
.fulldump.diff |
awk
'{print $5}'
)
FULLDUMP_MSG
=
$(
$PRINTF
"%8d"
$FULLDUMP
_DIFF_SIZE
)
if
[[
"
$ACCEPTED_
FULLDUMP
_DIFF
"
!=
*
"
$BIN_FILE
"
*
]]
;
then
DIFF_
FULLDUMP
=
true
if
[[
"
$KNOWN_
FULLDUMP
_DIFF
"
!=
*
"
$BIN_FILE
"
*
]]
;
then
FULLDUMP_MSG
=
"*
$FULLDUMP
_MSG
*"
REGRESSIONS
=
true
else
ELF_MSG
=
"
$ELF
_MSG
"
FULLDUMP_MSG
=
"
$FULLDUMP
_MSG
"
fi
else
ELF_MSG
=
"(
$ELF
_MSG
)"
DIFF_
ELF
=
FULLDUMP_MSG
=
"(
$FULLDUMP
_MSG
)"
DIFF_
FULLDUMP
=
fi
else
ELF
_MSG
=
" "
DIFF_
ELF
=
if
[[
"
$KNOWN_
DEP_DIFF
$ACCEPTED_DE
P_DIFF
"
=
*
"
$BIN_FILE
"
*
]]
;
then
ELF
_MSG
=
" ! "
FULLDUMP
_MSG
=
" "
DIFF_
FULLDUMP
=
if
[[
"
$KNOWN_
FULLDUMP_DIFF
$ACCEPTED_FULLDUM
P_DIFF
"
=
*
"
$BIN_FILE
"
*
]]
;
then
FULLDUMP
_MSG
=
" ! "
fi
fi
fi
...
...
@@ -845,7 +841,7 @@ compare_bin_file() {
# To get a raw diff with the complete disassembly, set
# DIS_DIFF_FILTER="$CAT"
if
[
-z
"
$DIS_DIFF_FILTER
"
]
;
then
DIS_DIFF_FILTER
=
"
$GREP
-v ' # .* <.*>
$'
"
DIS_DIFF_FILTER
=
"
$GREP
-v ' # .* <.*>
$'
|
$SED
-r -e 's/(
\b
|x)([0-9a-fA-F]+)(
\b
|:|>)/X/g'
"
fi
$DIS_CMD
$OTHER_FILE
|
$GREP
-v
$NAME
|
eval
"
$DIS_DIFF_FILTER
"
>
$WORK_FILE_BASE
.dis.other 2>&1
$DIS_CMD
$THIS_FILE
|
$GREP
-v
$NAME
|
eval
"
$DIS_DIFF_FILTER
"
>
$WORK_FILE_BASE
.dis.this 2>&1
...
...
@@ -877,12 +873,12 @@ compare_bin_file() {
fi
if
[
-n
"
$DIFF_BIN$DIFF_SIZE$DIFF_SYM$DIFF_DEP$DIFF_
ELF
$DIFF_DIS
"
]
||
[
-n
"
$VERBOSE
"
]
;
then
if
[
-n
"
$DIFF_BIN$DIFF_SIZE$DIFF_SYM$DIFF_DEP$DIFF_
FULLDUMP
$DIFF_DIS
"
]
||
[
-n
"
$VERBOSE
"
]
;
then
if
[
-n
"
$BIN_MSG
"
]
;
then
echo
-n
"
$BIN_MSG
:"
;
fi
if
[
-n
"
$SIZE_MSG
"
]
;
then
echo
-n
"
$SIZE_MSG
:"
;
fi
if
[
-n
"
$SYM_MSG
"
]
;
then
echo
-n
"
$SYM_MSG
:"
;
fi
if
[
-n
"
$DEP_MSG
"
]
;
then
echo
-n
"
$DEP_MSG
:"
;
fi
if
[
-n
"
$
ELF_MSG
"
]
;
then
echo
-n
"
$ELF
_MSG
:"
;
fi
if
[
-n
"
$
FULLDUMP_MSG
"
]
;
then
echo
-n
"
$FULLDUMP
_MSG
:"
;
fi
if
[
-n
"
$DIS_MSG
"
]
;
then
echo
-n
"
$DIS_MSG
:"
;
fi
echo
"
$BIN_FILE
"
if
[
"
$SHOW_DIFFS
"
=
"true"
]
;
then
...
...
@@ -1015,6 +1011,9 @@ if [ -z "$1" ] || [ "$1" = "-h" ] || [ "$1" = "-?" ] || [ "$1" = "/h" ] || [ "$1
echo
"-vv More verbose output, shows diff output of all comparisons"
echo
"-o [OTHER] Compare with build in other directory. Will default to the old build directory"
echo
""
echo
"--sort-symbols Sort all symbols before comparing"
echo
"--strip Strip all binaries before comparing"
echo
""
echo
"[FILTER] List filenames in the image to compare, works for jars, zips, libs and execs"
echo
"Example:"
echo
"bash ./common/bin/compareimages.sh CodePointIM.jar"
...
...
@@ -1107,6 +1106,12 @@ while [ -n "$1" ]; do
shift
shift
;;
--sort-symbols
)
SORT_ALL_SYMBOLS
=
true
;;
--strip
)
STRIP_ALL
=
true
;;
*
)
CMP_NAMES
=
false
CMP_PERMS
=
false
...
...
@@ -1223,7 +1228,7 @@ if [ "$SKIP_DEFAULT" != "true" ]; then
OTHER_JDK_BUNDLE
=
"
$OTHER
/images/jdk-bundle"
OTHER_JRE_BUNDLE
=
"
$OTHER
/images/jre-bundle"
fi
echo
"Also comparing macosx bundles"
echo
"Also comparing
jdk
macosx bundles"
echo
"
$THIS_JDK_BUNDLE
"
echo
"
$OTHER_JDK_BUNDLE
"
fi
...
...
hotspot/.hgtags
浏览文件 @
dd5257d5
...
...
@@ -485,3 +485,4 @@ e9e63d93bbfe2c6c23447e2c1f5cc71c98671cba jdk9-b79
8e8377739c06b99b9011c003c77e0bef84c91e09 jdk9-b80
4142c190cd5ca4fb70ec367b4f97ef936272d8ef jdk9-b81
1c453a12be3036d482abef1dd470f8aff536b6b9 jdk9-b82
3ed0df2c553a80e0e26b91a6ce08806ea17a066a jdk9-b83
hotspot/src/cpu/aarch64/vm/aarch64.ad
浏览文件 @
dd5257d5
...
...
@@ -3803,82 +3803,38 @@ encode %{
enc_class aarch64_enc_cmpxchg(memory mem, iRegLNoSp oldval, iRegLNoSp newval) %{
MacroAssembler _masm(&cbuf);
Register old_reg = as_Register($oldval$$reg);
Register new_reg = as_Register($newval$$reg);
Register base = as_Register($mem$$base);
Register addr_reg;
int index = $mem$$index;
int scale = $mem$$scale;
int disp = $mem$$disp;
if (index == -1) {
if (disp != 0) {
__ lea(rscratch2, Address(base, disp));
addr_reg = rscratch2;
} else {
// TODO
// should we ever get anything other than this case?
addr_reg = base;
}
} else {
Register index_reg = as_Register(index);
if (disp == 0) {
__ lea(rscratch2, Address(base, index_reg, Address::lsl(scale)));
addr_reg = rscratch2;
} else {
__ lea(rscratch2, Address(base, disp));
__ lea(rscratch2, Address(rscratch2, index_reg, Address::lsl(scale)));
addr_reg = rscratch2;
}
}
Label retry_load, done;
__ bind(retry_load);
__ ldxr(rscratch1, addr_reg);
__ cmp(rscratch1, old_reg);
__ br(Assembler::NE, done);
__ stlxr(rscratch1, new_reg, addr_reg);
__ cbnzw(rscratch1, retry_load);
__ bind(done);
guarantee($mem$$index == -1 && $mem$$disp == 0, "impossible encoding");
__ cmpxchg($mem$$base$$Register, $oldval$$Register, $newval$$Register,
&Assembler::ldxr, &MacroAssembler::cmp, &Assembler::stlxr);
%}
enc_class aarch64_enc_cmpxchgw(memory mem, iRegINoSp oldval, iRegINoSp newval) %{
MacroAssembler _masm(&cbuf);
Register old_reg = as_Register($oldval$$reg);
Register new_reg = as_Register($newval$$reg);
Register base = as_Register($mem$$base);
Register addr_reg;
int index = $mem$$index;
int scale = $mem$$scale;
int disp = $mem$$disp;
if (index == -1) {
if (disp != 0) {
__ lea(rscratch2, Address(base, disp));
addr_reg = rscratch2;
} else {
// TODO
// should we ever get anything other than this case?
addr_reg = base;
}
} else {
Register index_reg = as_Register(index);
if (disp == 0) {
__ lea(rscratch2, Address(base, index_reg, Address::lsl(scale)));
addr_reg = rscratch2;
} else {
__ lea(rscratch2, Address(base, disp));
__ lea(rscratch2, Address(rscratch2, index_reg, Address::lsl(scale)));
addr_reg = rscratch2;
}
}
Label retry_load, done;
__ bind(retry_load);
__ ldxrw(rscratch1, addr_reg);
__ cmpw(rscratch1, old_reg);
__ br(Assembler::NE, done);
__ stlxrw(rscratch1, new_reg, addr_reg);
__ cbnzw(rscratch1, retry_load);
__ bind(done);
guarantee($mem$$index == -1 && $mem$$disp == 0, "impossible encoding");
__ cmpxchg($mem$$base$$Register, $oldval$$Register, $newval$$Register,
&Assembler::ldxrw, &MacroAssembler::cmpw, &Assembler::stlxrw);
%}
// The only difference between aarch64_enc_cmpxchg and
// aarch64_enc_cmpxchg_acq is that we use load-acquire in the
// CompareAndSwap sequence to serve as a barrier on acquiring a
// lock.
enc_class aarch64_enc_cmpxchg_acq(memory mem, iRegLNoSp oldval, iRegLNoSp newval) %{
MacroAssembler _masm(&cbuf);
guarantee($mem$$index == -1 && $mem$$disp == 0, "impossible encoding");
__ cmpxchg($mem$$base$$Register, $oldval$$Register, $newval$$Register,
&Assembler::ldaxr, &MacroAssembler::cmp, &Assembler::stlxr);
%}
enc_class aarch64_enc_cmpxchgw_acq(memory mem, iRegINoSp oldval, iRegINoSp newval) %{
MacroAssembler _masm(&cbuf);
guarantee($mem$$index == -1 && $mem$$disp == 0, "impossible encoding");
__ cmpxchg($mem$$base$$Register, $oldval$$Register, $newval$$Register,
&Assembler::ldaxrw, &MacroAssembler::cmpw, &Assembler::stlxrw);
%}
// auxiliary used for CompareAndSwapX to set result register
enc_class aarch64_enc_cset_eq(iRegINoSp res) %{
MacroAssembler _masm(&cbuf);
...
...
@@ -4398,13 +4354,10 @@ encode %{
// Compare object markOop with mark and if equal exchange scratch1
// with object markOop.
// Note that this is simply a CAS: it does not generate any
// barriers. These are separately generated by
// membar_acquire_lock().
{
Label retry_load;
__ bind(retry_load);
__ ldxr(tmp, oop);
__ ld
a
xr(tmp, oop);
__ cmp(tmp, disp_hdr);
__ br(Assembler::NE, cas_failed);
// use stlxr to ensure update is immediately visible
...
...
@@ -4454,7 +4407,7 @@ encode %{
{
Label retry_load, fail;
__ bind(retry_load);
__ ldxr(rscratch1, tmp);
__ ld
a
xr(rscratch1, tmp);
__ cmp(disp_hdr, rscratch1);
__ br(Assembler::NE, fail);
// use stlxr to ensure update is immediately visible
...
...
@@ -8017,10 +7970,10 @@ instruct membar_acquire_lock() %{
match(MemBarAcquireLock);
ins_cost(VOLATILE_REF_COST);
format %{ "membar_acquire_lock" %}
format %{ "membar_acquire_lock
(elided)
" %}
ins_encode %{
__
membar(Assembler::LoadLoad|Assembler::LoadStore
);
__
block_comment("membar_acquire_lock (elided)"
);
%}
ins_pipe(pipe_serial);
...
...
@@ -8080,10 +8033,10 @@ instruct membar_release_lock() %{
match(MemBarReleaseLock);
ins_cost(VOLATILE_REF_COST);
format %{ "membar_release_lock" %}
format %{ "membar_release_lock
(elided)
" %}
ins_encode %{
__
membar(Assembler::LoadStore|Assembler::StoreStore
);
__
block_comment("membar_release_lock (elided)"
);
%}
ins_pipe(pipe_serial);
...
...
@@ -8369,7 +8322,11 @@ instruct storePConditional(memory heap_top_ptr, iRegP oldval, iRegP newval, rFla
ins_pipe(pipe_serial);
%}
// this has to be implemented as a CAS
// storeLConditional is used by PhaseMacroExpand::expand_lock_node
// when attempting to rebias a lock towards the current thread. We
// must use the acquire form of cmpxchg in order to guarantee acquire
// semantics in this case.
instruct storeLConditional(indirect mem, iRegLNoSp oldval, iRegLNoSp newval, rFlagsReg cr)
%{
match(Set cr (StoreLConditional mem (Binary oldval newval)));
...
...
@@ -8381,12 +8338,14 @@ instruct storeLConditional(indirect mem, iRegLNoSp oldval, iRegLNoSp newval, rFl
"cmpw rscratch1, zr\t# EQ on successful write"
%}
ins_encode(aarch64_enc_cmpxchg(mem, oldval, newval));
ins_encode(aarch64_enc_cmpxchg
_acq
(mem, oldval, newval));
ins_pipe(pipe_slow);
%}
// this has to be implemented as a CAS
// storeIConditional also has acquire semantics, for no better reason
// than matching storeLConditional. At the time of writing this
// comment storeIConditional was not used anywhere by AArch64.
instruct storeIConditional(indirect mem, iRegINoSp oldval, iRegINoSp newval, rFlagsReg cr)
%{
match(Set cr (StoreIConditional mem (Binary oldval newval)));
...
...
@@ -8398,7 +8357,7 @@ instruct storeIConditional(indirect mem, iRegINoSp oldval, iRegINoSp newval, rFl
"cmpw rscratch1, zr\t# EQ on successful write"
%}
ins_encode(aarch64_enc_cmpxchgw(mem, oldval, newval));
ins_encode(aarch64_enc_cmpxchgw
_acq
(mem, oldval, newval));
ins_pipe(pipe_slow);
%}
...
...
hotspot/src/cpu/aarch64/vm/macroAssembler_aarch64.hpp
浏览文件 @
dd5257d5
...
...
@@ -917,6 +917,8 @@ public:
void
cmpptr
(
Register
src1
,
Address
src2
);
// Various forms of CAS
void
cmpxchgptr
(
Register
oldv
,
Register
newv
,
Register
addr
,
Register
tmp
,
Label
&
suceed
,
Label
*
fail
);
...
...
@@ -938,6 +940,23 @@ public:
str
(
rscratch2
,
adr
);
}
// A generic CAS; success or failure is in the EQ flag.
template
<
typename
T1
,
typename
T2
>
void
cmpxchg
(
Register
addr
,
Register
expected
,
Register
new_val
,
T1
load_insn
,
void
(
MacroAssembler
::*
cmp_insn
)(
Register
,
Register
),
T2
store_insn
,
Register
tmp
=
rscratch1
)
{
Label
retry_load
,
done
;
bind
(
retry_load
);
(
this
->*
load_insn
)(
tmp
,
addr
);
(
this
->*
cmp_insn
)(
tmp
,
expected
);
br
(
Assembler
::
NE
,
done
);
(
this
->*
store_insn
)(
tmp
,
new_val
,
addr
);
cbnzw
(
tmp
,
retry_load
);
bind
(
done
);
}
// Calls
address
trampoline_call
(
Address
entry
,
CodeBuffer
*
cbuf
=
NULL
);
...
...
hotspot/src/cpu/x86/vm/assembler_x86.cpp
浏览文件 @
dd5257d5
此差异已折叠。
点击以展开。
hotspot/src/cpu/x86/vm/assembler_x86.hpp
浏览文件 @
dd5257d5
...
...
@@ -438,7 +438,9 @@ class ArrayAddress VALUE_OBJ_CLASS_SPEC {
};
const
int
FPUStateSizeInWords
=
NOT_LP64
(
27
)
LP64_ONLY
(
512
*
2
/
wordSize
);
// 64-bit refect the fxsave size which is 512 bytes and the new xsave area on EVEX which is another 2176 bytes
// See fxsave and xsave(EVEX enabled) documentation for layout
const
int
FPUStateSizeInWords
=
NOT_LP64
(
27
)
LP64_ONLY
(
2688
/
wordSize
);
// The Intel x86/Amd64 Assembler: Pure assembler doing NO optimizations on the instruction
// level (e.g. mov rax, 0 is not translated into xor rax, rax!); i.e., what you write
...
...
@@ -594,11 +596,16 @@ class Assembler : public AbstractAssembler {
private:
int
evex_encoding
;
int
input_size_in_bits
;
int
avx_vector_len
;
int
tuple_type
;
bool
is_evex_instruction
;
int
_evex_encoding
;
int
_input_size_in_bits
;
int
_avx_vector_len
;
int
_tuple_type
;
bool
_is_evex_instruction
;
bool
_legacy_mode_bw
;
bool
_legacy_mode_dq
;
bool
_legacy_mode_vl
;
bool
_legacy_mode_vlbw
;
bool
_instruction_uses_vl
;
// 64bit prefixes
int
prefix_and_encode
(
int
reg_enc
,
bool
byteinst
=
false
);
...
...
@@ -972,11 +979,16 @@ private:
// belong in macro assembler but there is no need for both varieties to exist
void
init_attributes
(
void
)
{
evex_encoding
=
0
;
input_size_in_bits
=
0
;
avx_vector_len
=
AVX_NoVec
;
tuple_type
=
EVEX_ETUP
;
is_evex_instruction
=
false
;
_evex_encoding
=
0
;
_input_size_in_bits
=
0
;
_avx_vector_len
=
AVX_NoVec
;
_tuple_type
=
EVEX_ETUP
;
_is_evex_instruction
=
false
;
_legacy_mode_bw
=
(
VM_Version
::
supports_avx512bw
()
==
false
);
_legacy_mode_dq
=
(
VM_Version
::
supports_avx512dq
()
==
false
);
_legacy_mode_vl
=
(
VM_Version
::
supports_avx512vl
()
==
false
);
_legacy_mode_vlbw
=
(
VM_Version
::
supports_avx512vlbw
()
==
false
);
_instruction_uses_vl
=
false
;
}
void
lea
(
Register
dst
,
Address
src
);
...
...
@@ -1344,8 +1356,10 @@ private:
void
fxch
(
int
i
=
1
);
void
fxrstor
(
Address
src
);
void
xrstor
(
Address
src
);
void
fxsave
(
Address
dst
);
void
xsave
(
Address
dst
);
void
fyl2x
();
void
frndint
();
...
...
@@ -1479,11 +1493,12 @@ private:
void
movb
(
Address
dst
,
int
imm8
);
void
movb
(
Register
dst
,
Address
src
);
void
kmovq
(
KRegister
dst
,
KRegister
src
);
void
kmovq
l
(
KRegister
dst
,
KRegister
src
);
void
kmovql
(
KRegister
dst
,
Register
src
);
void
kmovdl
(
KRegister
dst
,
Register
src
);
void
kmovq
(
Address
dst
,
KRegister
src
);
void
kmovq
(
KRegister
dst
,
Address
src
);
void
kmovwl
(
KRegister
dst
,
Register
src
);
void
kmovql
(
Address
dst
,
KRegister
src
);
void
kmovql
(
KRegister
dst
,
Address
src
);
void
movdl
(
XMMRegister
dst
,
Register
src
);
void
movdl
(
Register
dst
,
XMMRegister
src
);
...
...
@@ -1509,9 +1524,12 @@ private:
void
vmovdqu
(
XMMRegister
dst
,
XMMRegister
src
);
// Move Unaligned 512bit Vector
void
evmovdqu
(
Address
dst
,
XMMRegister
src
,
int
vector_len
);
void
evmovdqu
(
XMMRegister
dst
,
Address
src
,
int
vector_len
);
void
evmovdqu
(
XMMRegister
dst
,
XMMRegister
src
,
int
vector_len
);
void
evmovdqul
(
Address
dst
,
XMMRegister
src
,
int
vector_len
);
void
evmovdqul
(
XMMRegister
dst
,
Address
src
,
int
vector_len
);
void
evmovdqul
(
XMMRegister
dst
,
XMMRegister
src
,
int
vector_len
);
void
evmovdquq
(
Address
dst
,
XMMRegister
src
,
int
vector_len
);
void
evmovdquq
(
XMMRegister
dst
,
Address
src
,
int
vector_len
);
void
evmovdquq
(
XMMRegister
dst
,
XMMRegister
src
,
int
vector_len
);
// Move lower 64bit to high 64bit in 128bit register
void
movlhps
(
XMMRegister
dst
,
XMMRegister
src
);
...
...
@@ -1643,6 +1661,7 @@ private:
// Pemutation of 64bit words
void
vpermq
(
XMMRegister
dst
,
XMMRegister
src
,
int
imm8
,
int
vector_len
);
void
vpermq
(
XMMRegister
dst
,
XMMRegister
src
,
int
imm8
);
void
pause
();
...
...
@@ -1920,6 +1939,10 @@ private:
void
vdivpd
(
XMMRegister
dst
,
XMMRegister
nds
,
Address
src
,
int
vector_len
);
void
vdivps
(
XMMRegister
dst
,
XMMRegister
nds
,
Address
src
,
int
vector_len
);
// Sqrt Packed Floating-Point Values - Double precision only
void
vsqrtpd
(
XMMRegister
dst
,
XMMRegister
src
,
int
vector_len
);
void
vsqrtpd
(
XMMRegister
dst
,
Address
src
,
int
vector_len
);
// Bitwise Logical AND of Packed Floating-Point Values
void
andpd
(
XMMRegister
dst
,
XMMRegister
src
);
void
andps
(
XMMRegister
dst
,
XMMRegister
src
);
...
...
@@ -2057,6 +2080,9 @@ private:
void
vextracti64x2h
(
XMMRegister
dst
,
XMMRegister
src
,
int
value
);
void
vextractf64x2h
(
XMMRegister
dst
,
XMMRegister
src
,
int
value
);
void
vextractf32x4h
(
XMMRegister
dst
,
XMMRegister
src
,
int
value
);
void
vextractf32x4h
(
Address
dst
,
XMMRegister
src
,
int
value
);
void
vinsertf32x4h
(
XMMRegister
dst
,
XMMRegister
nds
,
XMMRegister
src
,
int
value
);
void
vinsertf32x4h
(
XMMRegister
dst
,
Address
src
,
int
value
);
// duplicate 4-bytes integer data from src into 8 locations in dest
void
vpbroadcastd
(
XMMRegister
dst
,
XMMRegister
src
);
...
...
hotspot/src/cpu/x86/vm/c1_LIRAssembler_x86.cpp
浏览文件 @
dd5257d5
...
...
@@ -3798,16 +3798,24 @@ void LIR_Assembler::negate(LIR_Opr left, LIR_Opr dest) {
if
(
left
->
as_xmm_float_reg
()
!=
dest
->
as_xmm_float_reg
())
{
__
movflt
(
dest
->
as_xmm_float_reg
(),
left
->
as_xmm_float_reg
());
}
__
xorps
(
dest
->
as_xmm_float_reg
(),
ExternalAddress
((
address
)
float_signflip_pool
));
if
(
UseAVX
>
1
)
{
__
vnegatess
(
dest
->
as_xmm_float_reg
(),
dest
->
as_xmm_float_reg
(),
ExternalAddress
((
address
)
float_signflip_pool
));
}
else
{
__
xorps
(
dest
->
as_xmm_float_reg
(),
ExternalAddress
((
address
)
float_signflip_pool
));
}
}
else
if
(
dest
->
is_double_xmm
())
{
if
(
left
->
as_xmm_double_reg
()
!=
dest
->
as_xmm_double_reg
())
{
__
movdbl
(
dest
->
as_xmm_double_reg
(),
left
->
as_xmm_double_reg
());
}
__
xorpd
(
dest
->
as_xmm_double_reg
(),
ExternalAddress
((
address
)
double_signflip_pool
));
if
(
UseAVX
>
1
)
{
__
vnegatesd
(
dest
->
as_xmm_double_reg
(),
dest
->
as_xmm_double_reg
(),
ExternalAddress
((
address
)
double_signflip_pool
));
}
else
{
__
xorpd
(
dest
->
as_xmm_double_reg
(),
ExternalAddress
((
address
)
double_signflip_pool
));
}
}
else
if
(
left
->
is_single_fpu
()
||
left
->
is_double_fpu
())
{
assert
(
left
->
fpu
()
==
0
,
"arg must be on TOS"
);
assert
(
dest
->
fpu
()
==
0
,
"dest must be TOS"
);
...
...
hotspot/src/cpu/x86/vm/c1_Runtime1_x86.cpp
浏览文件 @
dd5257d5
...
...
@@ -401,11 +401,9 @@ static OopMap* generate_oop_map(StubAssembler* sasm, int num_rt_args,
}
else
if
(
UseSSE
==
1
)
{
int
xmm_off
=
xmm_regs_as_doubles_off
;
for
(
int
n
=
0
;
n
<
FrameMap
::
nof_xmm_regs
;
n
++
)
{
if
(
n
<
xmm_bypass_limit
)
{
VMReg
xmm_name_0
=
as_XMMRegister
(
n
)
->
as_VMReg
();
map
->
set_callee_saved
(
VMRegImpl
::
stack2reg
(
xmm_off
+
num_rt_args
),
xmm_name_0
);
}
for
(
int
n
=
0
;
n
<
FrameMap
::
nof_fpu_regs
;
n
++
)
{
VMReg
xmm_name_0
=
as_XMMRegister
(
n
)
->
as_VMReg
();
map
->
set_callee_saved
(
VMRegImpl
::
stack2reg
(
xmm_off
+
num_rt_args
),
xmm_name_0
);
xmm_off
+=
2
;
}
assert
(
xmm_off
==
float_regs_as_doubles_off
,
"incorrect number of xmm registers"
);
...
...
@@ -452,14 +450,11 @@ static OopMap* save_live_registers(StubAssembler* sasm, int num_rt_args,
__
frstor
(
Address
(
rsp
,
fpu_state_off
*
VMRegImpl
::
stack_slot_size
));
// Save the FPU registers in de-opt-able form
__
fstp_d
(
Address
(
rsp
,
float_regs_as_doubles_off
*
VMRegImpl
::
stack_slot_size
+
0
));
__
fstp_d
(
Address
(
rsp
,
float_regs_as_doubles_off
*
VMRegImpl
::
stack_slot_size
+
8
));
__
fstp_d
(
Address
(
rsp
,
float_regs_as_doubles_off
*
VMRegImpl
::
stack_slot_size
+
16
));
__
fstp_d
(
Address
(
rsp
,
float_regs_as_doubles_off
*
VMRegImpl
::
stack_slot_size
+
24
));
__
fstp_d
(
Address
(
rsp
,
float_regs_as_doubles_off
*
VMRegImpl
::
stack_slot_size
+
32
));
__
fstp_d
(
Address
(
rsp
,
float_regs_as_doubles_off
*
VMRegImpl
::
stack_slot_size
+
40
));
__
fstp_d
(
Address
(
rsp
,
float_regs_as_doubles_off
*
VMRegImpl
::
stack_slot_size
+
48
));
__
fstp_d
(
Address
(
rsp
,
float_regs_as_doubles_off
*
VMRegImpl
::
stack_slot_size
+
56
));
int
offset
=
0
;
for
(
int
n
=
0
;
n
<
FrameMap
::
nof_fpu_regs
;
n
++
)
{
__
fstp_d
(
Address
(
rsp
,
float_regs_as_doubles_off
*
VMRegImpl
::
stack_slot_size
+
offset
));
offset
+=
8
;
}
}
if
(
UseSSE
>=
2
)
{
...
...
@@ -468,52 +463,26 @@ static OopMap* save_live_registers(StubAssembler* sasm, int num_rt_args,
// so always save them as doubles.
// note that float values are _not_ converted automatically, so for float values
// the second word contains only garbage data.
__
movdbl
(
Address
(
rsp
,
xmm_regs_as_doubles_off
*
VMRegImpl
::
stack_slot_size
+
0
),
xmm0
);
__
movdbl
(
Address
(
rsp
,
xmm_regs_as_doubles_off
*
VMRegImpl
::
stack_slot_size
+
8
),
xmm1
);
__
movdbl
(
Address
(
rsp
,
xmm_regs_as_doubles_off
*
VMRegImpl
::
stack_slot_size
+
16
),
xmm2
);
__
movdbl
(
Address
(
rsp
,
xmm_regs_as_doubles_off
*
VMRegImpl
::
stack_slot_size
+
24
),
xmm3
);
__
movdbl
(
Address
(
rsp
,
xmm_regs_as_doubles_off
*
VMRegImpl
::
stack_slot_size
+
32
),
xmm4
);
__
movdbl
(
Address
(
rsp
,
xmm_regs_as_doubles_off
*
VMRegImpl
::
stack_slot_size
+
40
),
xmm5
);
__
movdbl
(
Address
(
rsp
,
xmm_regs_as_doubles_off
*
VMRegImpl
::
stack_slot_size
+
48
),
xmm6
);
__
movdbl
(
Address
(
rsp
,
xmm_regs_as_doubles_off
*
VMRegImpl
::
stack_slot_size
+
56
),
xmm7
);
int
xmm_bypass_limit
=
FrameMap
::
nof_xmm_regs
;
int
offset
=
0
;
#ifdef _LP64
__
movdbl
(
Address
(
rsp
,
xmm_regs_as_doubles_off
*
VMRegImpl
::
stack_slot_size
+
64
),
xmm8
);
__
movdbl
(
Address
(
rsp
,
xmm_regs_as_doubles_off
*
VMRegImpl
::
stack_slot_size
+
72
),
xmm9
);
__
movdbl
(
Address
(
rsp
,
xmm_regs_as_doubles_off
*
VMRegImpl
::
stack_slot_size
+
80
),
xmm10
);
__
movdbl
(
Address
(
rsp
,
xmm_regs_as_doubles_off
*
VMRegImpl
::
stack_slot_size
+
88
),
xmm11
);
__
movdbl
(
Address
(
rsp
,
xmm_regs_as_doubles_off
*
VMRegImpl
::
stack_slot_size
+
96
),
xmm12
);
__
movdbl
(
Address
(
rsp
,
xmm_regs_as_doubles_off
*
VMRegImpl
::
stack_slot_size
+
104
),
xmm13
);
__
movdbl
(
Address
(
rsp
,
xmm_regs_as_doubles_off
*
VMRegImpl
::
stack_slot_size
+
112
),
xmm14
);
__
movdbl
(
Address
(
rsp
,
xmm_regs_as_doubles_off
*
VMRegImpl
::
stack_slot_size
+
120
),
xmm15
);
if
(
UseAVX
>
2
)
{
__
movdbl
(
Address
(
rsp
,
xmm_regs_as_doubles_off
*
VMRegImpl
::
stack_slot_size
+
128
),
xmm16
);
__
movdbl
(
Address
(
rsp
,
xmm_regs_as_doubles_off
*
VMRegImpl
::
stack_slot_size
+
136
),
xmm17
);
__
movdbl
(
Address
(
rsp
,
xmm_regs_as_doubles_off
*
VMRegImpl
::
stack_slot_size
+
144
),
xmm18
);
__
movdbl
(
Address
(
rsp
,
xmm_regs_as_doubles_off
*
VMRegImpl
::
stack_slot_size
+
152
),
xmm19
);
__
movdbl
(
Address
(
rsp
,
xmm_regs_as_doubles_off
*
VMRegImpl
::
stack_slot_size
+
160
),
xmm20
);
__
movdbl
(
Address
(
rsp
,
xmm_regs_as_doubles_off
*
VMRegImpl
::
stack_slot_size
+
168
),
xmm21
);
__
movdbl
(
Address
(
rsp
,
xmm_regs_as_doubles_off
*
VMRegImpl
::
stack_slot_size
+
176
),
xmm22
);
__
movdbl
(
Address
(
rsp
,
xmm_regs_as_doubles_off
*
VMRegImpl
::
stack_slot_size
+
184
),
xmm23
);
__
movdbl
(
Address
(
rsp
,
xmm_regs_as_doubles_off
*
VMRegImpl
::
stack_slot_size
+
192
),
xmm24
);
__
movdbl
(
Address
(
rsp
,
xmm_regs_as_doubles_off
*
VMRegImpl
::
stack_slot_size
+
200
),
xmm25
);
__
movdbl
(
Address
(
rsp
,
xmm_regs_as_doubles_off
*
VMRegImpl
::
stack_slot_size
+
208
),
xmm26
);
__
movdbl
(
Address
(
rsp
,
xmm_regs_as_doubles_off
*
VMRegImpl
::
stack_slot_size
+
216
),
xmm27
);
__
movdbl
(
Address
(
rsp
,
xmm_regs_as_doubles_off
*
VMRegImpl
::
stack_slot_size
+
224
),
xmm28
);
__
movdbl
(
Address
(
rsp
,
xmm_regs_as_doubles_off
*
VMRegImpl
::
stack_slot_size
+
232
),
xmm29
);
__
movdbl
(
Address
(
rsp
,
xmm_regs_as_doubles_off
*
VMRegImpl
::
stack_slot_size
+
240
),
xmm30
);
__
movdbl
(
Address
(
rsp
,
xmm_regs_as_doubles_off
*
VMRegImpl
::
stack_slot_size
+
248
),
xmm31
);
if
(
UseAVX
<
3
)
{
xmm_bypass_limit
=
xmm_bypass_limit
/
2
;
}
#endif
for
(
int
n
=
0
;
n
<
xmm_bypass_limit
;
n
++
)
{
XMMRegister
xmm_name
=
as_XMMRegister
(
n
);
__
movdbl
(
Address
(
rsp
,
xmm_regs_as_doubles_off
*
VMRegImpl
::
stack_slot_size
+
offset
),
xmm_name
);
offset
+=
8
;
}
#endif // _LP64
}
else
if
(
UseSSE
==
1
)
{
// save XMM registers as float because double not supported without SSE2
__
movflt
(
Address
(
rsp
,
xmm_regs_as_doubles_off
*
VMRegImpl
::
stack_slot_size
+
0
),
xmm0
);
__
movflt
(
Address
(
rsp
,
xmm_regs_as_doubles_off
*
VMRegImpl
::
stack_slot_size
+
8
),
xmm1
);
__
movflt
(
Address
(
rsp
,
xmm_regs_as_doubles_off
*
VMRegImpl
::
stack_slot_size
+
16
),
xmm2
);
__
movflt
(
Address
(
rsp
,
xmm_regs_as_doubles_off
*
VMRegImpl
::
stack_slot_size
+
24
),
xmm3
);
__
movflt
(
Address
(
rsp
,
xmm_regs_as_doubles_off
*
VMRegImpl
::
stack_slot_size
+
32
),
xmm4
);
__
movflt
(
Address
(
rsp
,
xmm_regs_as_doubles_off
*
VMRegImpl
::
stack_slot_size
+
40
),
xmm5
);
__
movflt
(
Address
(
rsp
,
xmm_regs_as_doubles_off
*
VMRegImpl
::
stack_slot_size
+
48
),
xmm6
);
__
movflt
(
Address
(
rsp
,
xmm_regs_as_doubles_off
*
VMRegImpl
::
stack_slot_size
+
56
),
xmm7
);
// save XMM registers as float because double not supported without SSE2(num MMX == num fpu)
int
offset
=
0
;
for
(
int
n
=
0
;
n
<
FrameMap
::
nof_fpu_regs
;
n
++
)
{
XMMRegister
xmm_name
=
as_XMMRegister
(
n
);
__
movflt
(
Address
(
rsp
,
xmm_regs_as_doubles_off
*
VMRegImpl
::
stack_slot_size
+
offset
),
xmm_name
);
offset
+=
8
;
}
}
}
...
...
@@ -528,52 +497,26 @@ static void restore_fpu(StubAssembler* sasm, bool restore_fpu_registers = true)
if
(
restore_fpu_registers
)
{
if
(
UseSSE
>=
2
)
{
// restore XMM registers
__
movdbl
(
xmm0
,
Address
(
rsp
,
xmm_regs_as_doubles_off
*
VMRegImpl
::
stack_slot_size
+
0
));
__
movdbl
(
xmm1
,
Address
(
rsp
,
xmm_regs_as_doubles_off
*
VMRegImpl
::
stack_slot_size
+
8
));
__
movdbl
(
xmm2
,
Address
(
rsp
,
xmm_regs_as_doubles_off
*
VMRegImpl
::
stack_slot_size
+
16
));
__
movdbl
(
xmm3
,
Address
(
rsp
,
xmm_regs_as_doubles_off
*
VMRegImpl
::
stack_slot_size
+
24
));
__
movdbl
(
xmm4
,
Address
(
rsp
,
xmm_regs_as_doubles_off
*
VMRegImpl
::
stack_slot_size
+
32
));
__
movdbl
(
xmm5
,
Address
(
rsp
,
xmm_regs_as_doubles_off
*
VMRegImpl
::
stack_slot_size
+
40
));
__
movdbl
(
xmm6
,
Address
(
rsp
,
xmm_regs_as_doubles_off
*
VMRegImpl
::
stack_slot_size
+
48
));
__
movdbl
(
xmm7
,
Address
(
rsp
,
xmm_regs_as_doubles_off
*
VMRegImpl
::
stack_slot_size
+
56
));
int
xmm_bypass_limit
=
FrameMap
::
nof_xmm_regs
;
#ifdef _LP64
__
movdbl
(
xmm8
,
Address
(
rsp
,
xmm_regs_as_doubles_off
*
VMRegImpl
::
stack_slot_size
+
64
));
__
movdbl
(
xmm9
,
Address
(
rsp
,
xmm_regs_as_doubles_off
*
VMRegImpl
::
stack_slot_size
+
72
));
__
movdbl
(
xmm10
,
Address
(
rsp
,
xmm_regs_as_doubles_off
*
VMRegImpl
::
stack_slot_size
+
80
));
__
movdbl
(
xmm11
,
Address
(
rsp
,
xmm_regs_as_doubles_off
*
VMRegImpl
::
stack_slot_size
+
88
));
__
movdbl
(
xmm12
,
Address
(
rsp
,
xmm_regs_as_doubles_off
*
VMRegImpl
::
stack_slot_size
+
96
));
__
movdbl
(
xmm13
,
Address
(
rsp
,
xmm_regs_as_doubles_off
*
VMRegImpl
::
stack_slot_size
+
104
));
__
movdbl
(
xmm14
,
Address
(
rsp
,
xmm_regs_as_doubles_off
*
VMRegImpl
::
stack_slot_size
+
112
));
__
movdbl
(
xmm15
,
Address
(
rsp
,
xmm_regs_as_doubles_off
*
VMRegImpl
::
stack_slot_size
+
120
));
if
(
UseAVX
>
2
)
{
__
movdbl
(
xmm16
,
Address
(
rsp
,
xmm_regs_as_doubles_off
*
VMRegImpl
::
stack_slot_size
+
128
));
__
movdbl
(
xmm17
,
Address
(
rsp
,
xmm_regs_as_doubles_off
*
VMRegImpl
::
stack_slot_size
+
136
));
__
movdbl
(
xmm18
,
Address
(
rsp
,
xmm_regs_as_doubles_off
*
VMRegImpl
::
stack_slot_size
+
144
));
__
movdbl
(
xmm19
,
Address
(
rsp
,
xmm_regs_as_doubles_off
*
VMRegImpl
::
stack_slot_size
+
152
));
__
movdbl
(
xmm20
,
Address
(
rsp
,
xmm_regs_as_doubles_off
*
VMRegImpl
::
stack_slot_size
+
160
));
__
movdbl
(
xmm21
,
Address
(
rsp
,
xmm_regs_as_doubles_off
*
VMRegImpl
::
stack_slot_size
+
168
));
__
movdbl
(
xmm22
,
Address
(
rsp
,
xmm_regs_as_doubles_off
*
VMRegImpl
::
stack_slot_size
+
176
));
__
movdbl
(
xmm23
,
Address
(
rsp
,
xmm_regs_as_doubles_off
*
VMRegImpl
::
stack_slot_size
+
184
));
__
movdbl
(
xmm24
,
Address
(
rsp
,
xmm_regs_as_doubles_off
*
VMRegImpl
::
stack_slot_size
+
192
));
__
movdbl
(
xmm25
,
Address
(
rsp
,
xmm_regs_as_doubles_off
*
VMRegImpl
::
stack_slot_size
+
200
));
__
movdbl
(
xmm26
,
Address
(
rsp
,
xmm_regs_as_doubles_off
*
VMRegImpl
::
stack_slot_size
+
208
));
__
movdbl
(
xmm27
,
Address
(
rsp
,
xmm_regs_as_doubles_off
*
VMRegImpl
::
stack_slot_size
+
216
));
__
movdbl
(
xmm28
,
Address
(
rsp
,
xmm_regs_as_doubles_off
*
VMRegImpl
::
stack_slot_size
+
224
));
__
movdbl
(
xmm29
,
Address
(
rsp
,
xmm_regs_as_doubles_off
*
VMRegImpl
::
stack_slot_size
+
232
));
__
movdbl
(
xmm30
,
Address
(
rsp
,
xmm_regs_as_doubles_off
*
VMRegImpl
::
stack_slot_size
+
240
));
__
movdbl
(
xmm31
,
Address
(
rsp
,
xmm_regs_as_doubles_off
*
VMRegImpl
::
stack_slot_size
+
248
));
if
(
UseAVX
<
3
)
{
xmm_bypass_limit
=
xmm_bypass_limit
/
2
;
}
#endif
int
offset
=
0
;
for
(
int
n
=
0
;
n
<
xmm_bypass_limit
;
n
++
)
{
XMMRegister
xmm_name
=
as_XMMRegister
(
n
);
__
movdbl
(
xmm_name
,
Address
(
rsp
,
xmm_regs_as_doubles_off
*
VMRegImpl
::
stack_slot_size
+
offset
));
offset
+=
8
;
}
#endif // _LP64
}
else
if
(
UseSSE
==
1
)
{
// restore XMM registers
__
movflt
(
xmm0
,
Address
(
rsp
,
xmm_regs_as_doubles_off
*
VMRegImpl
::
stack_slot_size
+
0
));
__
movflt
(
xmm1
,
Address
(
rsp
,
xmm_regs_as_doubles_off
*
VMRegImpl
::
stack_slot_size
+
8
));
__
movflt
(
xmm2
,
Address
(
rsp
,
xmm_regs_as_doubles_off
*
VMRegImpl
::
stack_slot_size
+
16
));
__
movflt
(
xmm3
,
Address
(
rsp
,
xmm_regs_as_doubles_off
*
VMRegImpl
::
stack_slot_size
+
24
));
__
movflt
(
xmm4
,
Address
(
rsp
,
xmm_regs_as_doubles_off
*
VMRegImpl
::
stack_slot_size
+
32
));
__
movflt
(
xmm5
,
Address
(
rsp
,
xmm_regs_as_doubles_off
*
VMRegImpl
::
stack_slot_size
+
40
));
__
movflt
(
xmm6
,
Address
(
rsp
,
xmm_regs_as_doubles_off
*
VMRegImpl
::
stack_slot_size
+
48
));
__
movflt
(
xmm7
,
Address
(
rsp
,
xmm_regs_as_doubles_off
*
VMRegImpl
::
stack_slot_size
+
56
));
// restore XMM registers(num MMX == num fpu)
int
offset
=
0
;
for
(
int
n
=
0
;
n
<
FrameMap
::
nof_fpu_regs
;
n
++
)
{
XMMRegister
xmm_name
=
as_XMMRegister
(
n
);
__
movflt
(
xmm_name
,
Address
(
rsp
,
xmm_regs_as_doubles_off
*
VMRegImpl
::
stack_slot_size
+
offset
));
offset
+=
8
;
}
}
if
(
UseSSE
<
2
)
{
...
...
hotspot/src/cpu/x86/vm/macroAssembler_x86.cpp
浏览文件 @
dd5257d5
...
...
@@ -3751,8 +3751,31 @@ void MacroAssembler::pop_CPU_state() {
}
void
MacroAssembler
::
pop_FPU_state
()
{
NOT_LP64
(
frstor
(
Address
(
rsp
,
0
));)
LP64_ONLY
(
fxrstor
(
Address
(
rsp
,
0
));)
#ifndef _LP64
frstor
(
Address
(
rsp
,
0
));
#else
// AVX will continue to use the fxsave area.
// EVEX needs to utilize the xsave area, which is under different
// management.
if
(
VM_Version
::
supports_evex
())
{
// EDX:EAX describe the XSAVE header and
// are obtained while fetching info for XCR0 via cpuid.
// These two registers make up 64-bits in the header for which bits
// 62:10 are currently reserved for future implementations and unused. Bit 63
// is unused for our implementation as we do not utilize
// compressed XSAVE areas. Bits 9..8 are currently ignored as we do not use
// the functionality for PKRU state and MSR tracing.
// Ergo we are primarily concerned with bits 7..0, which define
// which ISA extensions and features are enabled for a given machine and are
// defined in XemXcr0Eax and is used to map the XSAVE area
// for restoring registers as described via XCR0.
movl
(
rdx
,
VM_Version
::
get_xsave_header_upper_segment
());
movl
(
rax
,
VM_Version
::
get_xsave_header_lower_segment
());
xrstor
(
Address
(
rsp
,
0
));
}
else
{
fxrstor
(
Address
(
rsp
,
0
));
}
#endif
addptr
(
rsp
,
FPUStateSizeInWords
*
wordSize
);
}
...
...
@@ -3769,13 +3792,49 @@ void MacroAssembler::push_CPU_state() {
push_FPU_state
();
}
#ifdef _LP64
#define XSTATE_BV 0x200
#endif
void
MacroAssembler
::
push_FPU_state
()
{
subptr
(
rsp
,
FPUStateSizeInWords
*
wordSize
);
#ifndef _LP64
fnsave
(
Address
(
rsp
,
0
));
fwait
();
#else
fxsave
(
Address
(
rsp
,
0
));
// AVX will continue to use the fxsave area.
// EVEX needs to utilize the xsave area, which is under different
// management.
if
(
VM_Version
::
supports_evex
())
{
// Save a copy of EAX and EDX
push
(
rax
);
push
(
rdx
);
// EDX:EAX describe the XSAVE header and
// are obtained while fetching info for XCR0 via cpuid.
// These two registers make up 64-bits in the header for which bits
// 62:10 are currently reserved for future implementations and unused. Bit 63
// is unused for our implementation as we do not utilize
// compressed XSAVE areas. Bits 9..8 are currently ignored as we do not use
// the functionality for PKRU state and MSR tracing.
// Ergo we are primarily concerned with bits 7..0, which define
// which ISA extensions and features are enabled for a given machine and are
// defined in XemXcr0Eax and is used to program XSAVE area
// for saving the required registers as defined in XCR0.
int
xcr0_edx
=
VM_Version
::
get_xsave_header_upper_segment
();
int
xcr0_eax
=
VM_Version
::
get_xsave_header_lower_segment
();
movl
(
rdx
,
xcr0_edx
);
movl
(
rax
,
xcr0_eax
);
xsave
(
Address
(
rsp
,
wordSize
*
2
));
// now Apply control bits and clear bytes 8..23 in the header
pop
(
rdx
);
pop
(
rax
);
movl
(
Address
(
rsp
,
XSTATE_BV
),
xcr0_eax
);
movl
(
Address
(
rsp
,
XSTATE_BV
+
4
),
xcr0_edx
);
andq
(
Address
(
rsp
,
XSTATE_BV
+
8
),
0
);
andq
(
Address
(
rsp
,
XSTATE_BV
+
16
),
0
);
}
else
{
fxsave
(
Address
(
rsp
,
0
));
}
#endif // LP64
}
...
...
@@ -4082,6 +4141,84 @@ void MacroAssembler::vsubss(XMMRegister dst, XMMRegister nds, AddressLiteral src
}
}
void
MacroAssembler
::
vnegatess
(
XMMRegister
dst
,
XMMRegister
nds
,
AddressLiteral
src
)
{
int
nds_enc
=
nds
->
encoding
();
int
dst_enc
=
dst
->
encoding
();
bool
dst_upper_bank
=
(
dst_enc
>
15
);
bool
nds_upper_bank
=
(
nds_enc
>
15
);
if
(
VM_Version
::
supports_avx512novl
()
&&
(
nds_upper_bank
||
dst_upper_bank
))
{
if
(
dst_upper_bank
)
{
subptr
(
rsp
,
64
);
evmovdqul
(
Address
(
rsp
,
0
),
xmm0
,
Assembler
::
AVX_512bit
);
movflt
(
xmm0
,
nds
);
if
(
reachable
(
src
))
{
vxorps
(
xmm0
,
xmm0
,
as_Address
(
src
),
Assembler
::
AVX_128bit
);
}
else
{
lea
(
rscratch1
,
src
);
vxorps
(
xmm0
,
xmm0
,
Address
(
rscratch1
,
0
),
Assembler
::
AVX_128bit
);
}
movflt
(
dst
,
xmm0
);
evmovdqul
(
xmm0
,
Address
(
rsp
,
0
),
Assembler
::
AVX_512bit
);
addptr
(
rsp
,
64
);
}
else
{
movflt
(
dst
,
nds
);
if
(
reachable
(
src
))
{
vxorps
(
dst
,
dst
,
as_Address
(
src
),
Assembler
::
AVX_128bit
);
}
else
{
lea
(
rscratch1
,
src
);
vxorps
(
dst
,
dst
,
Address
(
rscratch1
,
0
),
Assembler
::
AVX_128bit
);
}
}
}
else
{
if
(
reachable
(
src
))
{
vxorps
(
dst
,
nds
,
as_Address
(
src
),
Assembler
::
AVX_128bit
);
}
else
{
lea
(
rscratch1
,
src
);
vxorps
(
dst
,
nds
,
Address
(
rscratch1
,
0
),
Assembler
::
AVX_128bit
);
}
}
}
void
MacroAssembler
::
vnegatesd
(
XMMRegister
dst
,
XMMRegister
nds
,
AddressLiteral
src
)
{
int
nds_enc
=
nds
->
encoding
();
int
dst_enc
=
dst
->
encoding
();
bool
dst_upper_bank
=
(
dst_enc
>
15
);
bool
nds_upper_bank
=
(
nds_enc
>
15
);
if
(
VM_Version
::
supports_avx512novl
()
&&
(
nds_upper_bank
||
dst_upper_bank
))
{
if
(
dst_upper_bank
)
{
subptr
(
rsp
,
64
);
evmovdqul
(
Address
(
rsp
,
0
),
xmm0
,
Assembler
::
AVX_512bit
);
movdbl
(
xmm0
,
nds
);
if
(
reachable
(
src
))
{
vxorps
(
xmm0
,
xmm0
,
as_Address
(
src
),
Assembler
::
AVX_128bit
);
}
else
{
lea
(
rscratch1
,
src
);
vxorps
(
xmm0
,
xmm0
,
Address
(
rscratch1
,
0
),
Assembler
::
AVX_128bit
);
}
movdbl
(
dst
,
xmm0
);
evmovdqul
(
xmm0
,
Address
(
rsp
,
0
),
Assembler
::
AVX_512bit
);
addptr
(
rsp
,
64
);
}
else
{
movdbl
(
dst
,
nds
);
if
(
reachable
(
src
))
{
vxorps
(
dst
,
dst
,
as_Address
(
src
),
Assembler
::
AVX_128bit
);
}
else
{
lea
(
rscratch1
,
src
);
vxorps
(
dst
,
dst
,
Address
(
rscratch1
,
0
),
Assembler
::
AVX_128bit
);
}
}
}
else
{
if
(
reachable
(
src
))
{
vxorpd
(
dst
,
nds
,
as_Address
(
src
),
Assembler
::
AVX_128bit
);
}
else
{
lea
(
rscratch1
,
src
);
vxorpd
(
dst
,
nds
,
Address
(
rscratch1
,
0
),
Assembler
::
AVX_128bit
);
}
}
}
void
MacroAssembler
::
vxorpd
(
XMMRegister
dst
,
XMMRegister
nds
,
AddressLiteral
src
,
int
vector_len
)
{
if
(
reachable
(
src
))
{
vxorpd
(
dst
,
nds
,
as_Address
(
src
),
vector_len
);
...
...
@@ -4318,7 +4455,6 @@ void MacroAssembler::store_check(Register obj, Address dst) {
void
MacroAssembler
::
store_check
(
Register
obj
)
{
// Does a store check for the oop in register obj. The content of
// register obj is destroyed afterwards.
BarrierSet
*
bs
=
Universe
::
heap
()
->
barrier_set
();
assert
(
bs
->
kind
()
==
BarrierSet
::
CardTableForRS
||
bs
->
kind
()
==
BarrierSet
::
CardTableExtension
,
...
...
@@ -4572,69 +4708,58 @@ void MacroAssembler::fp_runtime_fallback(address runtime_entry, int nb_args, int
// if we are coming from c1, xmm registers may be live
int
off
=
0
;
int
num_xmm_regs
=
LP64_ONLY
(
16
)
NOT_LP64
(
8
);
if
(
UseAVX
>
2
)
{
num_xmm_regs
=
LP64_ONLY
(
32
)
NOT_LP64
(
8
);
}
if
(
UseSSE
==
1
)
{
subptr
(
rsp
,
sizeof
(
jdouble
)
*
8
);
movflt
(
Address
(
rsp
,
off
++*
sizeof
(
jdouble
)),
xmm0
);
movflt
(
Address
(
rsp
,
off
++*
sizeof
(
jdouble
)),
xmm1
);
movflt
(
Address
(
rsp
,
off
++*
sizeof
(
jdouble
)),
xmm2
);
movflt
(
Address
(
rsp
,
off
++*
sizeof
(
jdouble
)),
xmm3
);
movflt
(
Address
(
rsp
,
off
++*
sizeof
(
jdouble
)),
xmm4
);
movflt
(
Address
(
rsp
,
off
++*
sizeof
(
jdouble
)),
xmm5
);
movflt
(
Address
(
rsp
,
off
++*
sizeof
(
jdouble
)),
xmm6
);
movflt
(
Address
(
rsp
,
off
++*
sizeof
(
jdouble
)),
xmm7
);
for
(
int
n
=
0
;
n
<
8
;
n
++
)
{
movflt
(
Address
(
rsp
,
off
++*
sizeof
(
jdouble
)),
as_XMMRegister
(
n
));
}
}
else
if
(
UseSSE
>=
2
)
{
if
(
UseAVX
>
2
)
{
push
(
rbx
);
movl
(
rbx
,
0xffff
);
#ifdef _LP64
kmovql
(
k1
,
rbx
);
#else
kmovdl
(
k1
,
rbx
);
#endif
kmovwl
(
k1
,
rbx
);
pop
(
rbx
);
}
#ifdef COMPILER2
if
(
MaxVectorSize
>
16
)
{
assert
(
UseAVX
>
0
,
"256bit vectors are supported only with AVX"
);
if
(
UseAVX
>
2
)
{
// Save upper half of ZMM registes
subptr
(
rsp
,
32
*
num_xmm_regs
);
for
(
int
n
=
0
;
n
<
num_xmm_regs
;
n
++
)
{
vextractf64x4h
(
Address
(
rsp
,
off
++*
32
),
as_XMMRegister
(
n
));
}
off
=
0
;
}
assert
(
UseAVX
>
0
,
"256 bit vectors are supported only with AVX"
);
// Save upper half of YMM registes
subptr
(
rsp
,
16
*
LP64_ONLY
(
16
)
NOT_LP64
(
8
));
vextractf128h
(
Address
(
rsp
,
0
),
xmm0
);
vextractf128h
(
Address
(
rsp
,
16
),
xmm1
);
vextractf128h
(
Address
(
rsp
,
32
),
xmm2
);
vextractf128h
(
Address
(
rsp
,
48
),
xmm3
);
vextractf128h
(
Address
(
rsp
,
64
),
xmm4
);
vextractf128h
(
Address
(
rsp
,
80
),
xmm5
);
vextractf128h
(
Address
(
rsp
,
96
),
xmm6
);
vextractf128h
(
Address
(
rsp
,
112
),
xmm7
);
#ifdef _LP64
vextractf128h
(
Address
(
rsp
,
128
),
xmm8
);
vextractf128h
(
Address
(
rsp
,
144
),
xmm9
);
vextractf128h
(
Address
(
rsp
,
160
),
xmm10
);
vextractf128h
(
Address
(
rsp
,
176
),
xmm11
);
vextractf128h
(
Address
(
rsp
,
192
),
xmm12
);
vextractf128h
(
Address
(
rsp
,
208
),
xmm13
);
vextractf128h
(
Address
(
rsp
,
224
),
xmm14
);
vextractf128h
(
Address
(
rsp
,
240
),
xmm15
);
#endif
subptr
(
rsp
,
16
*
num_xmm_regs
);
for
(
int
n
=
0
;
n
<
num_xmm_regs
;
n
++
)
{
vextractf128h
(
Address
(
rsp
,
off
++*
16
),
as_XMMRegister
(
n
));
}
}
#endif
// Save whole 128bit (16 bytes) XMM regiters
subptr
(
rsp
,
16
*
LP64_ONLY
(
16
)
NOT_LP64
(
8
));
movdqu
(
Address
(
rsp
,
off
++*
16
),
xmm0
);
movdqu
(
Address
(
rsp
,
off
++*
16
),
xmm1
);
movdqu
(
Address
(
rsp
,
off
++*
16
),
xmm2
);
movdqu
(
Address
(
rsp
,
off
++*
16
),
xmm3
);
movdqu
(
Address
(
rsp
,
off
++*
16
),
xmm4
);
movdqu
(
Address
(
rsp
,
off
++*
16
),
xmm5
);
movdqu
(
Address
(
rsp
,
off
++*
16
),
xmm6
);
movdqu
(
Address
(
rsp
,
off
++*
16
),
xmm7
);
// Save whole 128bit (16 bytes) XMM registers
subptr
(
rsp
,
16
*
num_xmm_regs
);
off
=
0
;
#ifdef _LP64
movdqu
(
Address
(
rsp
,
off
++*
16
),
xmm8
);
movdqu
(
Address
(
rsp
,
off
++*
16
),
xmm9
);
movdqu
(
Address
(
rsp
,
off
++*
16
),
xmm10
);
movdqu
(
Address
(
rsp
,
off
++*
16
),
xmm11
);
movdqu
(
Address
(
rsp
,
off
++*
16
),
xmm12
);
movdqu
(
Address
(
rsp
,
off
++*
16
),
xmm13
);
movdqu
(
Address
(
rsp
,
off
++*
16
),
xmm14
);
movdqu
(
Address
(
rsp
,
off
++*
16
),
xmm15
);
if
(
VM_Version
::
supports_avx512novl
())
{
for
(
int
n
=
0
;
n
<
num_xmm_regs
;
n
++
)
{
vextractf32x4h
(
Address
(
rsp
,
off
++*
16
),
as_XMMRegister
(
n
),
0
);
}
}
else
{
for
(
int
n
=
0
;
n
<
num_xmm_regs
;
n
++
)
{
movdqu
(
Address
(
rsp
,
off
++*
16
),
as_XMMRegister
(
n
));
}
}
#else
for
(
int
n
=
0
;
n
<
num_xmm_regs
;
n
++
)
{
movdqu
(
Address
(
rsp
,
off
++*
16
),
as_XMMRegister
(
n
));
}
#endif
}
...
...
@@ -4689,7 +4814,7 @@ void MacroAssembler::fp_runtime_fallback(address runtime_entry, int nb_args, int
movsd
(
Address
(
rsp
,
0
),
xmm0
);
fld_d
(
Address
(
rsp
,
0
));
#endif // _LP64
addptr
(
rsp
,
sizeof
(
jdouble
)
*
nb_args
);
addptr
(
rsp
,
sizeof
(
jdouble
)
*
nb_args
);
if
(
num_fpu_regs_in_use
>
1
)
{
// Must save return value to stack and then restore entire FPU
// stack except incoming arguments
...
...
@@ -4699,63 +4824,50 @@ void MacroAssembler::fp_runtime_fallback(address runtime_entry, int nb_args, int
addptr
(
rsp
,
sizeof
(
jdouble
));
}
fld_d
(
Address
(
rsp
,
(
nb_args
-
1
)
*
sizeof
(
jdouble
)));
addptr
(
rsp
,
sizeof
(
jdouble
)
*
nb_args
);
addptr
(
rsp
,
sizeof
(
jdouble
)
*
nb_args
);
}
off
=
0
;
if
(
UseSSE
==
1
)
{
movflt
(
xmm0
,
Address
(
rsp
,
off
++*
sizeof
(
jdouble
)));
movflt
(
xmm1
,
Address
(
rsp
,
off
++*
sizeof
(
jdouble
)));
movflt
(
xmm2
,
Address
(
rsp
,
off
++*
sizeof
(
jdouble
)));
movflt
(
xmm3
,
Address
(
rsp
,
off
++*
sizeof
(
jdouble
)));
movflt
(
xmm4
,
Address
(
rsp
,
off
++*
sizeof
(
jdouble
)));
movflt
(
xmm5
,
Address
(
rsp
,
off
++*
sizeof
(
jdouble
)));
movflt
(
xmm6
,
Address
(
rsp
,
off
++*
sizeof
(
jdouble
)));
movflt
(
xmm7
,
Address
(
rsp
,
off
++*
sizeof
(
jdouble
)));
for
(
int
n
=
0
;
n
<
8
;
n
++
)
{
movflt
(
as_XMMRegister
(
n
),
Address
(
rsp
,
off
++*
sizeof
(
jdouble
)));
}
addptr
(
rsp
,
sizeof
(
jdouble
)
*
8
);
}
else
if
(
UseSSE
>=
2
)
{
// Restore whole 128bit (16 bytes) XMM regiters
movdqu
(
xmm0
,
Address
(
rsp
,
off
++*
16
));
movdqu
(
xmm1
,
Address
(
rsp
,
off
++*
16
));
movdqu
(
xmm2
,
Address
(
rsp
,
off
++*
16
));
movdqu
(
xmm3
,
Address
(
rsp
,
off
++*
16
));
movdqu
(
xmm4
,
Address
(
rsp
,
off
++*
16
));
movdqu
(
xmm5
,
Address
(
rsp
,
off
++*
16
));
movdqu
(
xmm6
,
Address
(
rsp
,
off
++*
16
));
movdqu
(
xmm7
,
Address
(
rsp
,
off
++*
16
));
#ifdef _LP64
movdqu
(
xmm8
,
Address
(
rsp
,
off
++*
16
));
movdqu
(
xmm9
,
Address
(
rsp
,
off
++*
16
));
movdqu
(
xmm10
,
Address
(
rsp
,
off
++*
16
));
movdqu
(
xmm11
,
Address
(
rsp
,
off
++*
16
));
movdqu
(
xmm12
,
Address
(
rsp
,
off
++*
16
));
movdqu
(
xmm13
,
Address
(
rsp
,
off
++*
16
));
movdqu
(
xmm14
,
Address
(
rsp
,
off
++*
16
));
movdqu
(
xmm15
,
Address
(
rsp
,
off
++*
16
));
if
(
VM_Version
::
supports_avx512novl
())
{
for
(
int
n
=
0
;
n
<
num_xmm_regs
;
n
++
)
{
vinsertf32x4h
(
as_XMMRegister
(
n
),
Address
(
rsp
,
off
++*
16
),
0
);
}
}
else
{
for
(
int
n
=
0
;
n
<
num_xmm_regs
;
n
++
)
{
movdqu
(
as_XMMRegister
(
n
),
Address
(
rsp
,
off
++*
16
));
}
}
#else
for
(
int
n
=
0
;
n
<
num_xmm_regs
;
n
++
)
{
movdqu
(
as_XMMRegister
(
n
),
Address
(
rsp
,
off
++
*
16
));
}
#endif
addptr
(
rsp
,
16
*
LP64_ONLY
(
16
)
NOT_LP64
(
8
));
addptr
(
rsp
,
16
*
num_xmm_regs
);
#ifdef COMPILER2
if
(
MaxVectorSize
>
16
)
{
// Restore upper half of YMM registes.
vinsertf128h
(
xmm0
,
Address
(
rsp
,
0
));
vinsertf128h
(
xmm1
,
Address
(
rsp
,
16
));
vinsertf128h
(
xmm2
,
Address
(
rsp
,
32
));
vinsertf128h
(
xmm3
,
Address
(
rsp
,
48
));
vinsertf128h
(
xmm4
,
Address
(
rsp
,
64
));
vinsertf128h
(
xmm5
,
Address
(
rsp
,
80
));
vinsertf128h
(
xmm6
,
Address
(
rsp
,
96
));
vinsertf128h
(
xmm7
,
Address
(
rsp
,
112
));
#ifdef _LP64
vinsertf128h
(
xmm8
,
Address
(
rsp
,
128
));
vinsertf128h
(
xmm9
,
Address
(
rsp
,
144
));
vinsertf128h
(
xmm10
,
Address
(
rsp
,
160
));
vinsertf128h
(
xmm11
,
Address
(
rsp
,
176
));
vinsertf128h
(
xmm12
,
Address
(
rsp
,
192
));
vinsertf128h
(
xmm13
,
Address
(
rsp
,
208
));
vinsertf128h
(
xmm14
,
Address
(
rsp
,
224
));
vinsertf128h
(
xmm15
,
Address
(
rsp
,
240
));
#endif
addptr
(
rsp
,
16
*
LP64_ONLY
(
16
)
NOT_LP64
(
8
));
off
=
0
;
for
(
int
n
=
0
;
n
<
num_xmm_regs
;
n
++
)
{
vinsertf128h
(
as_XMMRegister
(
n
),
Address
(
rsp
,
off
++*
16
));
}
addptr
(
rsp
,
16
*
num_xmm_regs
);
if
(
UseAVX
>
2
)
{
off
=
0
;
for
(
int
n
=
0
;
n
<
num_xmm_regs
;
n
++
)
{
vinsertf64x4h
(
as_XMMRegister
(
n
),
Address
(
rsp
,
off
++*
32
));
}
addptr
(
rsp
,
32
*
num_xmm_regs
);
}
}
#endif
}
...
...
@@ -7095,11 +7207,7 @@ void MacroAssembler::generate_fill(BasicType t, bool aligned,
Label
L_fill_32_bytes_loop
,
L_check_fill_8_bytes
,
L_fill_8_bytes_loop
,
L_fill_8_bytes
;
if
(
UseAVX
>
2
)
{
movl
(
rtmp
,
0xffff
);
#ifdef _LP64
kmovql
(
k1
,
rtmp
);
#else
kmovdl
(
k1
,
rtmp
);
#endif
kmovwl
(
k1
,
rtmp
);
}
movdl
(
xtmp
,
value
);
if
(
UseAVX
>
2
&&
UseUnalignedLoadStores
)
{
...
...
@@ -7112,7 +7220,7 @@ void MacroAssembler::generate_fill(BasicType t, bool aligned,
align
(
16
);
BIND
(
L_fill_64_bytes_loop
);
evmovdqu
(
Address
(
to
,
0
),
xtmp
,
Assembler
::
AVX_512bit
);
evmovdqu
l
(
Address
(
to
,
0
),
xtmp
,
Assembler
::
AVX_512bit
);
addptr
(
to
,
64
);
subl
(
count
,
16
<<
shift
);
jcc
(
Assembler
::
greaterEqual
,
L_fill_64_bytes_loop
);
...
...
@@ -7120,7 +7228,7 @@ void MacroAssembler::generate_fill(BasicType t, bool aligned,
BIND
(
L_check_fill_32_bytes
);
addl
(
count
,
8
<<
shift
);
jccb
(
Assembler
::
less
,
L_check_fill_8_bytes
);
evmovdqu
(
Address
(
to
,
0
),
xtmp
,
Assembler
::
AVX_256bit
);
evmovdqu
l
(
Address
(
to
,
0
),
xtmp
,
Assembler
::
AVX_256bit
);
addptr
(
to
,
32
);
subl
(
count
,
8
<<
shift
);
...
...
@@ -8399,6 +8507,14 @@ void MacroAssembler::kernel_crc32(Register crc, Register buf, Register len, Regi
Label
L_tail
,
L_tail_restore
,
L_tail_loop
,
L_exit
,
L_align_loop
,
L_aligned
;
Label
L_fold_tail
,
L_fold_128b
,
L_fold_512b
,
L_fold_512b_loop
,
L_fold_tail_loop
;
// For EVEX with VL and BW, provide a standard mask, VL = 128 will guide the merge
// context for the registers used, where all instructions below are using 128-bit mode
// On EVEX without VL and BW, these instructions will all be AVX.
if
(
VM_Version
::
supports_avx512vlbw
())
{
movl
(
tmp
,
0xffff
);
kmovwl
(
k1
,
tmp
);
}
lea
(
table
,
ExternalAddress
(
StubRoutines
::
crc_table_addr
()));
notl
(
crc
);
// ~crc
cmpl
(
len
,
16
);
...
...
hotspot/src/cpu/x86/vm/macroAssembler_x86.hpp
浏览文件 @
dd5257d5
...
...
@@ -1069,6 +1069,9 @@ public:
void
vsubss
(
XMMRegister
dst
,
XMMRegister
nds
,
Address
src
)
{
Assembler
::
vsubss
(
dst
,
nds
,
src
);
}
void
vsubss
(
XMMRegister
dst
,
XMMRegister
nds
,
AddressLiteral
src
);
void
vnegatess
(
XMMRegister
dst
,
XMMRegister
nds
,
AddressLiteral
src
);
void
vnegatesd
(
XMMRegister
dst
,
XMMRegister
nds
,
AddressLiteral
src
);
// AVX Vector instructions
void
vxorpd
(
XMMRegister
dst
,
XMMRegister
nds
,
XMMRegister
src
,
int
vector_len
)
{
Assembler
::
vxorpd
(
dst
,
nds
,
src
,
vector_len
);
}
...
...
hotspot/src/cpu/x86/vm/sharedRuntime_x86_32.cpp
浏览文件 @
dd5257d5
...
...
@@ -115,6 +115,7 @@ class RegisterSaver {
OopMap
*
RegisterSaver
::
save_live_registers
(
MacroAssembler
*
masm
,
int
additional_frame_words
,
int
*
total_frame_words
,
bool
verify_fpu
,
bool
save_vectors
)
{
int
vect_words
=
0
;
int
num_xmm_regs
=
XMMRegisterImpl
::
number_of_registers
;
#ifdef COMPILER2
if
(
save_vectors
)
{
assert
(
UseAVX
>
0
,
"512bit vectors are supported only with EVEX"
);
...
...
@@ -173,59 +174,50 @@ OopMap* RegisterSaver::save_live_registers(MacroAssembler* masm, int additional_
__
fldcw
(
ExternalAddress
(
StubRoutines
::
addr_fpu_cntrl_wrd_std
()));
}
int
off
=
st0_off
;
int
delta
=
st1_off
-
off
;
// Save the FPU registers in de-opt-able form
for
(
int
n
=
0
;
n
<
FloatRegisterImpl
::
number_of_registers
;
n
++
)
{
__
fstp_d
(
Address
(
rsp
,
off
*
wordSize
));
off
+=
delta
;
}
__
fstp_d
(
Address
(
rsp
,
st0_off
*
wordSize
));
// st(0)
__
fstp_d
(
Address
(
rsp
,
st1_off
*
wordSize
));
// st(1)
__
fstp_d
(
Address
(
rsp
,
st2_off
*
wordSize
));
// st(2)
__
fstp_d
(
Address
(
rsp
,
st3_off
*
wordSize
));
// st(3)
__
fstp_d
(
Address
(
rsp
,
st4_off
*
wordSize
));
// st(4)
__
fstp_d
(
Address
(
rsp
,
st5_off
*
wordSize
));
// st(5)
__
fstp_d
(
Address
(
rsp
,
st6_off
*
wordSize
));
// st(6)
__
fstp_d
(
Address
(
rsp
,
st7_off
*
wordSize
));
// st(7)
if
(
UseSSE
==
1
)
{
// Save the XMM state
__
movflt
(
Address
(
rsp
,
xmm0_off
*
wordSize
),
xmm0
);
__
movflt
(
Address
(
rsp
,
xmm1_off
*
wordSize
),
xmm1
);
__
movflt
(
Address
(
rsp
,
xmm2_off
*
wordSize
),
xmm2
);
__
movflt
(
Address
(
rsp
,
xmm3_off
*
wordSize
),
xmm3
);
__
movflt
(
Address
(
rsp
,
xmm4_off
*
wordSize
),
xmm4
);
__
movflt
(
Address
(
rsp
,
xmm5_off
*
wordSize
),
xmm5
);
__
movflt
(
Address
(
rsp
,
xmm6_off
*
wordSize
),
xmm6
);
__
movflt
(
Address
(
rsp
,
xmm7_off
*
wordSize
),
xmm7
);
}
else
if
(
UseSSE
>=
2
)
{
off
=
xmm0_off
;
delta
=
xmm1_off
-
off
;
if
(
UseSSE
==
1
)
{
// Save the XMM state
for
(
int
n
=
0
;
n
<
num_xmm_regs
;
n
++
)
{
__
movflt
(
Address
(
rsp
,
off
*
wordSize
),
as_XMMRegister
(
n
));
off
+=
delta
;
}
}
else
if
(
UseSSE
>=
2
)
{
// Save whole 128bit (16 bytes) XMM regiters
__
movdqu
(
Address
(
rsp
,
xmm0_off
*
wordSize
),
xmm0
);
__
movdqu
(
Address
(
rsp
,
xmm1_off
*
wordSize
),
xmm1
);
__
movdqu
(
Address
(
rsp
,
xmm2_off
*
wordSize
),
xmm2
);
__
movdqu
(
Address
(
rsp
,
xmm3_off
*
wordSize
),
xmm3
);
__
movdqu
(
Address
(
rsp
,
xmm4_off
*
wordSize
),
xmm4
);
__
movdqu
(
Address
(
rsp
,
xmm5_off
*
wordSize
),
xmm5
);
__
movdqu
(
Address
(
rsp
,
xmm6_off
*
wordSize
),
xmm6
);
__
movdqu
(
Address
(
rsp
,
xmm7_off
*
wordSize
),
xmm7
);
if
(
VM_Version
::
supports_avx512novl
())
{
for
(
int
n
=
0
;
n
<
num_xmm_regs
;
n
++
)
{
__
vextractf32x4h
(
Address
(
rsp
,
off
*
wordSize
),
as_XMMRegister
(
n
),
0
);
off
+=
delta
;
}
}
else
{
for
(
int
n
=
0
;
n
<
num_xmm_regs
;
n
++
)
{
__
movdqu
(
Address
(
rsp
,
off
*
wordSize
),
as_XMMRegister
(
n
));
off
+=
delta
;
}
}
}
if
(
vect_words
>
0
)
{
assert
(
vect_words
*
wordSize
==
128
,
""
);
__
subptr
(
rsp
,
128
);
// Save upper half of YMM registes
__
vextractf128h
(
Address
(
rsp
,
0
),
xmm0
);
__
vextractf128h
(
Address
(
rsp
,
16
),
xmm1
);
__
vextractf128h
(
Address
(
rsp
,
32
),
xmm2
);
__
vextractf128h
(
Address
(
rsp
,
48
),
xmm3
);
__
vextractf128h
(
Address
(
rsp
,
64
),
xmm4
);
__
vextractf128h
(
Address
(
rsp
,
80
),
xmm5
);
__
vextractf128h
(
Address
(
rsp
,
96
),
xmm6
);
__
vextractf128h
(
Address
(
rsp
,
112
),
xmm7
);
off
=
0
;
for
(
int
n
=
0
;
n
<
num_xmm_regs
;
n
++
)
{
__
vextractf128h
(
Address
(
rsp
,
off
++*
16
),
as_XMMRegister
(
n
));
}
if
(
UseAVX
>
2
)
{
__
subptr
(
rsp
,
256
);
// Save upper half of ZMM registes
__
vextractf64x4h
(
Address
(
rsp
,
0
),
xmm0
);
__
vextractf64x4h
(
Address
(
rsp
,
32
),
xmm1
);
__
vextractf64x4h
(
Address
(
rsp
,
64
),
xmm2
);
__
vextractf64x4h
(
Address
(
rsp
,
96
),
xmm3
);
__
vextractf64x4h
(
Address
(
rsp
,
128
),
xmm4
);
__
vextractf64x4h
(
Address
(
rsp
,
160
),
xmm5
);
__
vextractf64x4h
(
Address
(
rsp
,
192
),
xmm6
);
__
vextractf64x4h
(
Address
(
rsp
,
224
),
xmm7
);
off
=
0
;
for
(
int
n
=
0
;
n
<
num_xmm_regs
;
n
++
)
{
__
vextractf64x4h
(
Address
(
rsp
,
off
++*
32
),
as_XMMRegister
(
n
));
}
}
}
...
...
@@ -238,58 +230,40 @@ OopMap* RegisterSaver::save_live_registers(MacroAssembler* masm, int additional_
OopMap
*
map
=
new
OopMap
(
frame_words
,
0
);
#define STACK_OFFSET(x) VMRegImpl::stack2reg((x) + additional_frame_words)
#define NEXTREG(x) (x)->as_VMReg()->next()
map
->
set_callee_saved
(
STACK_OFFSET
(
rax_off
),
rax
->
as_VMReg
());
map
->
set_callee_saved
(
STACK_OFFSET
(
rcx_off
),
rcx
->
as_VMReg
());
map
->
set_callee_saved
(
STACK_OFFSET
(
rdx_off
),
rdx
->
as_VMReg
());
map
->
set_callee_saved
(
STACK_OFFSET
(
rbx_off
),
rbx
->
as_VMReg
());
map
->
set_callee_saved
(
STACK_OFFSET
(
rax_off
),
rax
->
as_VMReg
());
map
->
set_callee_saved
(
STACK_OFFSET
(
rcx_off
),
rcx
->
as_VMReg
());
map
->
set_callee_saved
(
STACK_OFFSET
(
rdx_off
),
rdx
->
as_VMReg
());
map
->
set_callee_saved
(
STACK_OFFSET
(
rbx_off
),
rbx
->
as_VMReg
());
// rbp, location is known implicitly, no oopMap
map
->
set_callee_saved
(
STACK_OFFSET
(
rsi_off
),
rsi
->
as_VMReg
());
map
->
set_callee_saved
(
STACK_OFFSET
(
rdi_off
),
rdi
->
as_VMReg
());
map
->
set_callee_saved
(
STACK_OFFSET
(
st0_off
),
as_FloatRegister
(
0
)
->
as_VMReg
());
map
->
set_callee_saved
(
STACK_OFFSET
(
st1_off
),
as_FloatRegister
(
1
)
->
as_VMReg
());
map
->
set_callee_saved
(
STACK_OFFSET
(
st2_off
),
as_FloatRegister
(
2
)
->
as_VMReg
());
map
->
set_callee_saved
(
STACK_OFFSET
(
st3_off
),
as_FloatRegister
(
3
)
->
as_VMReg
());
map
->
set_callee_saved
(
STACK_OFFSET
(
st4_off
),
as_FloatRegister
(
4
)
->
as_VMReg
());
map
->
set_callee_saved
(
STACK_OFFSET
(
st5_off
),
as_FloatRegister
(
5
)
->
as_VMReg
());
map
->
set_callee_saved
(
STACK_OFFSET
(
st6_off
),
as_FloatRegister
(
6
)
->
as_VMReg
());
map
->
set_callee_saved
(
STACK_OFFSET
(
st7_off
),
as_FloatRegister
(
7
)
->
as_VMReg
());
map
->
set_callee_saved
(
STACK_OFFSET
(
xmm0_off
),
xmm0
->
as_VMReg
());
map
->
set_callee_saved
(
STACK_OFFSET
(
xmm1_off
),
xmm1
->
as_VMReg
());
map
->
set_callee_saved
(
STACK_OFFSET
(
xmm2_off
),
xmm2
->
as_VMReg
());
map
->
set_callee_saved
(
STACK_OFFSET
(
xmm3_off
),
xmm3
->
as_VMReg
());
map
->
set_callee_saved
(
STACK_OFFSET
(
xmm4_off
),
xmm4
->
as_VMReg
());
map
->
set_callee_saved
(
STACK_OFFSET
(
xmm5_off
),
xmm5
->
as_VMReg
());
map
->
set_callee_saved
(
STACK_OFFSET
(
xmm6_off
),
xmm6
->
as_VMReg
());
map
->
set_callee_saved
(
STACK_OFFSET
(
xmm7_off
),
xmm7
->
as_VMReg
());
// %%% This is really a waste but we'll keep things as they were for now
if
(
true
)
{
#define NEXTREG(x) (x)->as_VMReg()->next()
map
->
set_callee_saved
(
STACK_OFFSET
(
st0H_off
),
NEXTREG
(
as_FloatRegister
(
0
)));
map
->
set_callee_saved
(
STACK_OFFSET
(
st1H_off
),
NEXTREG
(
as_FloatRegister
(
1
)));
map
->
set_callee_saved
(
STACK_OFFSET
(
st2H_off
),
NEXTREG
(
as_FloatRegister
(
2
)));
map
->
set_callee_saved
(
STACK_OFFSET
(
st3H_off
),
NEXTREG
(
as_FloatRegister
(
3
)));
map
->
set_callee_saved
(
STACK_OFFSET
(
st4H_off
),
NEXTREG
(
as_FloatRegister
(
4
)));
map
->
set_callee_saved
(
STACK_OFFSET
(
st5H_off
),
NEXTREG
(
as_FloatRegister
(
5
)));
map
->
set_callee_saved
(
STACK_OFFSET
(
st6H_off
),
NEXTREG
(
as_FloatRegister
(
6
)));
map
->
set_callee_saved
(
STACK_OFFSET
(
st7H_off
),
NEXTREG
(
as_FloatRegister
(
7
)));
map
->
set_callee_saved
(
STACK_OFFSET
(
xmm0H_off
),
NEXTREG
(
xmm0
));
map
->
set_callee_saved
(
STACK_OFFSET
(
xmm1H_off
),
NEXTREG
(
xmm1
));
map
->
set_callee_saved
(
STACK_OFFSET
(
xmm2H_off
),
NEXTREG
(
xmm2
));
map
->
set_callee_saved
(
STACK_OFFSET
(
xmm3H_off
),
NEXTREG
(
xmm3
));
map
->
set_callee_saved
(
STACK_OFFSET
(
xmm4H_off
),
NEXTREG
(
xmm4
));
map
->
set_callee_saved
(
STACK_OFFSET
(
xmm5H_off
),
NEXTREG
(
xmm5
));
map
->
set_callee_saved
(
STACK_OFFSET
(
xmm6H_off
),
NEXTREG
(
xmm6
));
map
->
set_callee_saved
(
STACK_OFFSET
(
xmm7H_off
),
NEXTREG
(
xmm7
));
map
->
set_callee_saved
(
STACK_OFFSET
(
rsi_off
),
rsi
->
as_VMReg
());
map
->
set_callee_saved
(
STACK_OFFSET
(
rdi_off
),
rdi
->
as_VMReg
());
// %%% This is really a waste but we'll keep things as they were for now for the upper component
off
=
st0_off
;
delta
=
st1_off
-
off
;
for
(
int
n
=
0
;
n
<
FloatRegisterImpl
::
number_of_registers
;
n
++
)
{
FloatRegister
freg_name
=
as_FloatRegister
(
n
);
map
->
set_callee_saved
(
STACK_OFFSET
(
off
),
freg_name
->
as_VMReg
());
map
->
set_callee_saved
(
STACK_OFFSET
(
off
+
1
),
NEXTREG
(
freg_name
));
off
+=
delta
;
}
off
=
xmm0_off
;
delta
=
xmm1_off
-
off
;
for
(
int
n
=
0
;
n
<
num_xmm_regs
;
n
++
)
{
XMMRegister
xmm_name
=
as_XMMRegister
(
n
);
map
->
set_callee_saved
(
STACK_OFFSET
(
off
),
xmm_name
->
as_VMReg
());
map
->
set_callee_saved
(
STACK_OFFSET
(
off
+
1
),
NEXTREG
(
xmm_name
));
off
+=
delta
;
}
#undef NEXTREG
#undef STACK_OFFSET
}
return
map
;
}
void
RegisterSaver
::
restore_live_registers
(
MacroAssembler
*
masm
,
bool
restore_vectors
)
{
int
num_xmm_regs
=
XMMRegisterImpl
::
number_of_registers
;
// Recover XMM & FPU state
int
additional_frame_bytes
=
0
;
#ifdef COMPILER2
...
...
@@ -301,52 +275,43 @@ void RegisterSaver::restore_live_registers(MacroAssembler* masm, bool restore_ve
#else
assert
(
!
restore_vectors
,
"vectors are generated only by C2"
);
#endif
int
off
=
xmm0_off
;
int
delta
=
xmm1_off
-
off
;
if
(
UseSSE
==
1
)
{
assert
(
additional_frame_bytes
==
0
,
""
);
__
movflt
(
xmm0
,
Address
(
rsp
,
xmm0_off
*
wordSize
));
__
movflt
(
xmm1
,
Address
(
rsp
,
xmm1_off
*
wordSize
));
__
movflt
(
xmm2
,
Address
(
rsp
,
xmm2_off
*
wordSize
));
__
movflt
(
xmm3
,
Address
(
rsp
,
xmm3_off
*
wordSize
));
__
movflt
(
xmm4
,
Address
(
rsp
,
xmm4_off
*
wordSize
));
__
movflt
(
xmm5
,
Address
(
rsp
,
xmm5_off
*
wordSize
));
__
movflt
(
xmm6
,
Address
(
rsp
,
xmm6_off
*
wordSize
));
__
movflt
(
xmm7
,
Address
(
rsp
,
xmm7_off
*
wordSize
));
for
(
int
n
=
0
;
n
<
num_xmm_regs
;
n
++
)
{
__
movflt
(
as_XMMRegister
(
n
),
Address
(
rsp
,
off
*
wordSize
));
off
+=
delta
;
}
}
else
if
(
UseSSE
>=
2
)
{
#define STACK_ADDRESS(x) Address(rsp,(x)*wordSize + additional_frame_bytes)
__
movdqu
(
xmm0
,
STACK_ADDRESS
(
xmm0_off
));
__
movdqu
(
xmm1
,
STACK_ADDRESS
(
xmm1_off
));
__
movdqu
(
xmm2
,
STACK_ADDRESS
(
xmm2_off
));
__
movdqu
(
xmm3
,
STACK_ADDRESS
(
xmm3_off
));
__
movdqu
(
xmm4
,
STACK_ADDRESS
(
xmm4_off
));
__
movdqu
(
xmm5
,
STACK_ADDRESS
(
xmm5_off
));
__
movdqu
(
xmm6
,
STACK_ADDRESS
(
xmm6_off
));
__
movdqu
(
xmm7
,
STACK_ADDRESS
(
xmm7_off
));
#undef STACK_ADDRESS
if
(
VM_Version
::
supports_avx512novl
())
{
for
(
int
n
=
0
;
n
<
num_xmm_regs
;
n
++
)
{
__
vinsertf32x4h
(
as_XMMRegister
(
n
),
Address
(
rsp
,
off
*
wordSize
+
additional_frame_bytes
),
0
);
off
+=
delta
;
}
}
else
{
for
(
int
n
=
0
;
n
<
num_xmm_regs
;
n
++
)
{
__
movdqu
(
as_XMMRegister
(
n
),
Address
(
rsp
,
off
*
wordSize
+
additional_frame_bytes
));
off
+=
delta
;
}
}
}
if
(
restore_vectors
)
{
if
(
UseAVX
>
2
)
{
off
=
0
;
for
(
int
n
=
0
;
n
<
num_xmm_regs
;
n
++
)
{
__
vinsertf64x4h
(
as_XMMRegister
(
n
),
Address
(
rsp
,
off
++*
32
));
}
__
addptr
(
rsp
,
additional_frame_bytes
*
2
);
// Save upper half of ZMM registes
}
// Restore upper half of YMM registes.
assert
(
additional_frame_bytes
==
128
,
""
);
__
vinsertf128h
(
xmm0
,
Address
(
rsp
,
0
));
__
vinsertf128h
(
xmm1
,
Address
(
rsp
,
16
));
__
vinsertf128h
(
xmm2
,
Address
(
rsp
,
32
));
__
vinsertf128h
(
xmm3
,
Address
(
rsp
,
48
));
__
vinsertf128h
(
xmm4
,
Address
(
rsp
,
64
));
__
vinsertf128h
(
xmm5
,
Address
(
rsp
,
80
));
__
vinsertf128h
(
xmm6
,
Address
(
rsp
,
96
));
__
vinsertf128h
(
xmm7
,
Address
(
rsp
,
112
));
__
addptr
(
rsp
,
additional_frame_bytes
);
if
(
UseAVX
>
2
)
{
additional_frame_bytes
=
256
;
__
vinsertf64x4h
(
xmm0
,
Address
(
rsp
,
0
));
__
vinsertf64x4h
(
xmm1
,
Address
(
rsp
,
32
));
__
vinsertf64x4h
(
xmm2
,
Address
(
rsp
,
64
));
__
vinsertf64x4h
(
xmm3
,
Address
(
rsp
,
96
));
__
vinsertf64x4h
(
xmm4
,
Address
(
rsp
,
128
));
__
vinsertf64x4h
(
xmm5
,
Address
(
rsp
,
160
));
__
vinsertf64x4h
(
xmm6
,
Address
(
rsp
,
192
));
__
vinsertf64x4h
(
xmm7
,
Address
(
rsp
,
224
));
__
addptr
(
rsp
,
additional_frame_bytes
);
off
=
0
;
for
(
int
n
=
0
;
n
<
num_xmm_regs
;
n
++
)
{
__
vinsertf128h
(
as_XMMRegister
(
n
),
Address
(
rsp
,
off
++*
16
));
}
__
addptr
(
rsp
,
additional_frame_bytes
);
// Save upper half of YMM registes
}
__
pop_FPU_state
();
__
addptr
(
rsp
,
FPU_regs_live
*
wordSize
);
// Pop FPU registers
...
...
hotspot/src/cpu/x86/vm/sharedRuntime_x86_64.cpp
浏览文件 @
dd5257d5
此差异已折叠。
点击以展开。
hotspot/src/cpu/x86/vm/stubGenerator_x86_32.cpp
浏览文件 @
dd5257d5
...
...
@@ -795,6 +795,12 @@ class StubGenerator: public StubCodeGenerator {
void
xmm_copy_forward
(
Register
from
,
Register
to_from
,
Register
qword_count
)
{
assert
(
UseSSE
>=
2
,
"supported cpu only"
);
Label
L_copy_64_bytes_loop
,
L_copy_64_bytes
,
L_copy_8_bytes
,
L_exit
;
if
(
UseAVX
>
2
)
{
__
push
(
rbx
);
__
movl
(
rbx
,
0xffff
);
__
kmovdl
(
k1
,
rbx
);
__
pop
(
rbx
);
}
// Copy 64-byte chunks
__
jmpb
(
L_copy_64_bytes
);
__
align
(
OptoLoopAlignment
);
...
...
@@ -802,8 +808,8 @@ class StubGenerator: public StubCodeGenerator {
if
(
UseUnalignedLoadStores
)
{
if
(
UseAVX
>
2
)
{
__
evmovdqu
(
xmm0
,
Address
(
from
,
0
),
Assembler
::
AVX_512bit
);
__
evmovdqu
(
Address
(
from
,
to_from
,
Address
::
times_1
,
0
),
xmm0
,
Assembler
::
AVX_512bit
);
__
evmovdqu
l
(
xmm0
,
Address
(
from
,
0
),
Assembler
::
AVX_512bit
);
__
evmovdqu
l
(
Address
(
from
,
to_from
,
Address
::
times_1
,
0
),
xmm0
,
Assembler
::
AVX_512bit
);
}
else
if
(
UseAVX
==
2
)
{
__
vmovdqu
(
xmm0
,
Address
(
from
,
0
));
__
vmovdqu
(
Address
(
from
,
to_from
,
Address
::
times_1
,
0
),
xmm0
);
...
...
@@ -2217,6 +2223,15 @@ class StubGenerator: public StubCodeGenerator {
const
XMMRegister
xmm_temp4
=
xmm5
;
__
enter
();
// required for proper stackwalking of RuntimeStub frame
// For EVEX with VL and BW, provide a standard mask, VL = 128 will guide the merge
// context for the registers used, where all instructions below are using 128-bit mode
// On EVEX without VL and BW, these instructions will all be AVX.
if
(
VM_Version
::
supports_avx512vlbw
())
{
__
movl
(
rdx
,
0xffff
);
__
kmovdl
(
k1
,
rdx
);
}
__
movptr
(
from
,
from_param
);
__
movptr
(
key
,
key_param
);
...
...
@@ -2315,6 +2330,15 @@ class StubGenerator: public StubCodeGenerator {
const
XMMRegister
xmm_temp4
=
xmm5
;
__
enter
();
// required for proper stackwalking of RuntimeStub frame
// For EVEX with VL and BW, provide a standard mask, VL = 128 will guide the merge
// context for the registers used, where all instructions below are using 128-bit mode
// On EVEX without VL and BW, these instructions will all be AVX.
if
(
VM_Version
::
supports_avx512vlbw
())
{
__
movl
(
rdx
,
0xffff
);
__
kmovdl
(
k1
,
rdx
);
}
__
movptr
(
from
,
from_param
);
__
movptr
(
key
,
key_param
);
...
...
@@ -2441,6 +2465,14 @@ class StubGenerator: public StubCodeGenerator {
__
enter
();
// required for proper stackwalking of RuntimeStub frame
handleSOERegisters
(
true
/*saving*/
);
// For EVEX with VL and BW, provide a standard mask, VL = 128 will guide the merge
// context for the registers used, where all instructions below are using 128-bit mode
// On EVEX without VL and BW, these instructions will all be AVX.
if
(
VM_Version
::
supports_avx512vlbw
())
{
__
movl
(
rdx
,
0xffff
);
__
kmovdl
(
k1
,
rdx
);
}
// load registers from incoming parameters
const
Address
from_param
(
rbp
,
8
+
0
);
const
Address
to_param
(
rbp
,
8
+
4
);
...
...
@@ -2602,6 +2634,14 @@ class StubGenerator: public StubCodeGenerator {
__
enter
();
// required for proper stackwalking of RuntimeStub frame
handleSOERegisters
(
true
/*saving*/
);
// For EVEX with VL and BW, provide a standard mask, VL = 128 will guide the merge
// context for the registers used, where all instructions below are using 128-bit mode
// On EVEX without VL and BW, these instructions will all be AVX.
if
(
VM_Version
::
supports_avx512vlbw
())
{
__
movl
(
rdx
,
0xffff
);
__
kmovdl
(
k1
,
rdx
);
}
// load registers from incoming parameters
const
Address
from_param
(
rbp
,
8
+
0
);
const
Address
to_param
(
rbp
,
8
+
4
);
...
...
@@ -2782,6 +2822,14 @@ class StubGenerator: public StubCodeGenerator {
__
enter
();
handleSOERegisters
(
true
);
// Save registers
// For EVEX with VL and BW, provide a standard mask, VL = 128 will guide the merge
// context for the registers used, where all instructions below are using 128-bit mode
// On EVEX without VL and BW, these instructions will all be AVX.
if
(
VM_Version
::
supports_avx512vlbw
())
{
__
movl
(
rdx
,
0xffff
);
__
kmovdl
(
k1
,
rdx
);
}
__
movptr
(
state
,
state_param
);
__
movptr
(
subkeyH
,
subkeyH_param
);
__
movptr
(
data
,
data_param
);
...
...
hotspot/src/cpu/x86/vm/stubGenerator_x86_64.cpp
浏览文件 @
dd5257d5
此差异已折叠。
点击以展开。
hotspot/src/cpu/x86/vm/stubRoutines_x86_32.hpp
浏览文件 @
dd5257d5
...
...
@@ -31,7 +31,7 @@
enum
platform_dependent_constants
{
code_size1
=
9000
,
// simply increase if too small (assembler will crash if too small)
code_size2
=
22
000
// simply increase if too small (assembler will crash if too small)
code_size2
=
30
000
// simply increase if too small (assembler will crash if too small)
};
class
x86
{
...
...
hotspot/src/cpu/x86/vm/stubRoutines_x86_64.hpp
浏览文件 @
dd5257d5
...
...
@@ -33,7 +33,7 @@ static bool returns_to_call_stub(address return_pc) { return return_pc == _
enum
platform_dependent_constants
{
code_size1
=
19000
,
// simply increase if too small (assembler will crash if too small)
code_size2
=
24
000
// simply increase if too small (assembler will crash if too small)
code_size2
=
32
000
// simply increase if too small (assembler will crash if too small)
};
class
x86
{
...
...
hotspot/src/cpu/x86/vm/vm_version_x86.cpp
浏览文件 @
dd5257d5
此差异已折叠。
点击以展开。
hotspot/src/cpu/x86/vm/vm_version_x86.hpp
浏览文件 @
dd5257d5
此差异已折叠。
点击以展开。
hotspot/src/cpu/x86/vm/x86.ad
浏览文件 @
dd5257d5
此差异已折叠。
点击以展开。
hotspot/src/cpu/x86/vm/x86_32.ad
浏览文件 @
dd5257d5
此差异已折叠。
点击以展开。
hotspot/src/cpu/x86/vm/x86_64.ad
浏览文件 @
dd5257d5
此差异已折叠。
点击以展开。
hotspot/src/os/linux/vm/os_linux.cpp
浏览文件 @
dd5257d5
此差异已折叠。
点击以展开。
hotspot/src/os/windows/vm/os_windows.cpp
浏览文件 @
dd5257d5
此差异已折叠。
点击以展开。
hotspot/src/share/vm/adlc/formssel.cpp
浏览文件 @
dd5257d5
此差异已折叠。
点击以展开。
hotspot/src/share/vm/gc/cms/concurrentMarkSweepGeneration.cpp
浏览文件 @
dd5257d5
此差异已折叠。
点击以展开。
hotspot/src/share/vm/gc/g1/collectionSetChooser.cpp
浏览文件 @
dd5257d5
此差异已折叠。
点击以展开。
hotspot/src/share/vm/gc/g1/collectionSetChooser.hpp
浏览文件 @
dd5257d5
此差异已折叠。
点击以展开。
hotspot/src/share/vm/gc/g1/concurrentG1Refine.cpp
浏览文件 @
dd5257d5
此差异已折叠。
点击以展开。
hotspot/src/share/vm/gc/g1/concurrentG1Refine.hpp
浏览文件 @
dd5257d5
此差异已折叠。
点击以展开。
hotspot/src/share/vm/gc/g1/g1CollectedHeap.cpp
浏览文件 @
dd5257d5
此差异已折叠。
点击以展开。
hotspot/src/share/vm/gc/g1/g1CollectedHeap.hpp
浏览文件 @
dd5257d5
此差异已折叠。
点击以展开。
hotspot/src/share/vm/gc/g1/g1CollectedHeap_ext.cpp
浏览文件 @
dd5257d5
此差异已折叠。
点击以展开。
hotspot/src/share/vm/gc/g1/g1CollectorPolicy.cpp
浏览文件 @
dd5257d5
此差异已折叠。
点击以展开。
hotspot/src/share/vm/gc/g1/g1CollectorPolicy.hpp
浏览文件 @
dd5257d5
此差异已折叠。
点击以展开。
hotspot/src/share/vm/gc/g1/g1EvacStats.cpp
浏览文件 @
dd5257d5
此差异已折叠。
点击以展开。
hotspot/src/share/vm/gc/g1/g1ParScanThreadState.cpp
浏览文件 @
dd5257d5
此差异已折叠。
点击以展开。
hotspot/src/share/vm/gc/g1/g1ParScanThreadState.hpp
浏览文件 @
dd5257d5
此差异已折叠。
点击以展开。
hotspot/src/share/vm/gc/g1/g1ParScanThreadState_ext.cpp
0 → 100644
浏览文件 @
dd5257d5
此差异已折叠。
点击以展开。
hotspot/src/share/vm/gc/g1/g1RemSet.cpp
浏览文件 @
dd5257d5
此差异已折叠。
点击以展开。
hotspot/src/share/vm/gc/g1/g1RemSet.hpp
浏览文件 @
dd5257d5
此差异已折叠。
点击以展开。
hotspot/src/share/vm/gc/parallel/parallelScavengeHeap.hpp
浏览文件 @
dd5257d5
此差异已折叠。
点击以展开。
hotspot/src/share/vm/gc/serial/defNewGeneration.cpp
浏览文件 @
dd5257d5
此差异已折叠。
点击以展开。
hotspot/src/share/vm/gc/serial/tenuredGeneration.cpp
浏览文件 @
dd5257d5
此差异已折叠。
点击以展开。
hotspot/src/share/vm/gc/shared/ageTable.cpp
浏览文件 @
dd5257d5
此差异已折叠。
点击以展开。
hotspot/src/share/vm/gc/shared/ageTable.hpp
浏览文件 @
dd5257d5
此差异已折叠。
点击以展开。
hotspot/src/share/vm/gc/shared/blockOffsetTable.cpp
浏览文件 @
dd5257d5
此差异已折叠。
点击以展开。
hotspot/src/share/vm/gc/shared/genCollectedHeap.cpp
浏览文件 @
dd5257d5
此差异已折叠。
点击以展开。
hotspot/src/share/vm/gc/shared/genCollectedHeap.hpp
浏览文件 @
dd5257d5
此差异已折叠。
点击以展开。
hotspot/src/share/vm/opto/classes.hpp
浏览文件 @
dd5257d5
此差异已折叠。
点击以展开。
hotspot/src/share/vm/opto/ifnode.cpp
浏览文件 @
dd5257d5
此差异已折叠。
点击以展开。
hotspot/src/share/vm/opto/loopPredicate.cpp
浏览文件 @
dd5257d5
此差异已折叠。
点击以展开。
hotspot/src/share/vm/opto/loopnode.cpp
浏览文件 @
dd5257d5
此差异已折叠。
点击以展开。
hotspot/src/share/vm/opto/superword.cpp
浏览文件 @
dd5257d5
此差异已折叠。
点击以展开。
hotspot/src/share/vm/opto/vectornode.cpp
浏览文件 @
dd5257d5
此差异已折叠。
点击以展开。
hotspot/src/share/vm/opto/vectornode.hpp
浏览文件 @
dd5257d5
此差异已折叠。
点击以展开。
hotspot/src/share/vm/prims/whitebox.cpp
浏览文件 @
dd5257d5
此差异已折叠。
点击以展开。
hotspot/src/share/vm/services/lowMemoryDetector.cpp
浏览文件 @
dd5257d5
此差异已折叠。
点击以展开。
hotspot/src/share/vm/services/lowMemoryDetector.hpp
浏览文件 @
dd5257d5
此差异已折叠。
点击以展开。
hotspot/test/compiler/arraycopy/TestEliminatedArrayLoopPredicateCopyDeopt.java
0 → 100644
浏览文件 @
dd5257d5
此差异已折叠。
点击以展开。
hotspot/test/compiler/loopopts/superword/SumRedSqrt_Double.java
0 → 100644
浏览文件 @
dd5257d5
此差异已折叠。
点击以展开。
hotspot/test/compiler/rangechecks/TestBadFoldCompare.java
浏览文件 @
dd5257d5
此差异已折叠。
点击以展开。
hotspot/test/gc/g1/humongousObjects/TestHumongousThreshold.java
浏览文件 @
dd5257d5
此差异已折叠。
点击以展开。
hotspot/test/serviceability/dcmd/compiler/CodelistTest.java
浏览文件 @
dd5257d5
此差异已折叠。
点击以展开。
hotspot/test/testlibrary/jdk/test/lib/Utils.java
浏览文件 @
dd5257d5
此差异已折叠。
点击以展开。
hotspot/test/testlibrary_tests/whitebox/BlobSanityTest.java
0 → 100644
浏览文件 @
dd5257d5
此差异已折叠。
点击以展开。
make/Init.gmk
浏览文件 @
dd5257d5
此差异已折叠。
点击以展开。
make/InitSupport.gmk
浏览文件 @
dd5257d5
此差异已折叠。
点击以展开。
make/common/JavaCompilation.gmk
浏览文件 @
dd5257d5
此差异已折叠。
点击以展开。
make/common/NativeCompilation.gmk
浏览文件 @
dd5257d5
此差异已折叠。
点击以展开。
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录