--- a/.hgtags Wed Sep 26 18:36:55 2018 +0100
+++ b/.hgtags Thu Sep 27 10:49:10 2018 -0700
@@ -513,3 +513,4 @@
8f594f75e0547d4ca16649cb3501659e3155e81b jdk-12+10
f0f5d23449d31f1b3580c8a73313918cafeaefd7 jdk-12+11
15094d12a632f452a2064318a4e416d0c7a9ce0c jdk-12+12
+511a9946f83e3e3c7b9dbe1840367063fb39b4e1 jdk-12+13
--- a/make/RunTests.gmk Wed Sep 26 18:36:55 2018 +0100
+++ b/make/RunTests.gmk Thu Sep 27 10:49:10 2018 -0700
@@ -531,8 +531,8 @@
$1_JTREG_BASIC_OPTIONS += $$(addprefix -exclude:, $$($1_JTREG_PROBLEM_LIST))
endif
- ifneq ($$(JIB_JAR), )
- $1_JTREG_BASIC_OPTIONS += -cpa:$$(JIB_JAR)
+ ifneq ($$(JIB_HOME), )
+ $1_JTREG_BASIC_OPTIONS += -e:JIB_HOME=$$(JIB_HOME)
endif
$1_JTREG_BASIC_OPTIONS += -e:TEST_IMAGE_GRAAL_DIR=${TEST_IMAGE_DIR}/hotspot/jtreg/graal
--- a/make/autoconf/spec.gmk.in Wed Sep 26 18:36:55 2018 +0100
+++ b/make/autoconf/spec.gmk.in Thu Sep 27 10:49:10 2018 -0700
@@ -723,7 +723,7 @@
XATTR:=@XATTR@
JT_HOME:=@JT_HOME@
JTREGEXE:=@JTREGEXE@
-JIB_JAR:=@JIB_JAR@
+JIB_HOME:=@JIB_HOME@
XCODEBUILD=@XCODEBUILD@
DTRACE := @DTRACE@
FIXPATH:=@FIXPATH@
--- a/make/autoconf/toolchain.m4 Wed Sep 26 18:36:55 2018 +0100
+++ b/make/autoconf/toolchain.m4 Thu Sep 27 10:49:10 2018 -0700
@@ -1144,5 +1144,5 @@
fi
fi
- AC_SUBST(JIB_JAR)
+ AC_SUBST(JIB_HOME)
])
--- a/make/conf/jib-profiles.js Wed Sep 26 18:36:55 2018 +0100
+++ b/make/conf/jib-profiles.js Thu Sep 27 10:49:10 2018 -0700
@@ -840,7 +840,7 @@
linux_x64: "gcc7.3.0-OEL6.4+1.0",
macosx_x64: "Xcode9.4-MacOSX10.13+1.0",
solaris_x64: "SS12u4-Solaris11u1+1.0",
- solaris_sparcv9: "SS12u4-Solaris11u1+1.1",
+ solaris_sparcv9: "SS12u6-Solaris11u3+1.0",
windows_x64: "VS2017-15.5.5+1.0",
linux_aarch64: (input.profile != null && input.profile.indexOf("arm64") >= 0
? "gcc-linaro-aarch64-linux-gnu-4.8-2013.11_linux+1.0"
@@ -961,9 +961,9 @@
ext: "zip",
classifier: "distribution",
revision: "3.0-SNAPSHOT",
- environment_name: "JIB_JAR",
+ environment_name: "JIB_HOME",
environment_value: input.get("jib", "install_path")
- + "/jib-3.0-SNAPSHOT-distribution/lib/jib-3.0-SNAPSHOT.jar"
+ + "/jib-3.0-SNAPSHOT-distribution"
},
ant: {
--- a/make/devkit/createSolarisDevkit12.6.sh Wed Sep 26 18:36:55 2018 +0100
+++ b/make/devkit/createSolarisDevkit12.6.sh Thu Sep 27 10:49:10 2018 -0700
@@ -34,18 +34,19 @@
# install in a separate temporary image.
#
# The Solaris Studio installation must contain at least these packages:
-# developer/developerstudio-126/backend 12.6-1.0.0.0 i--
-# developer/developerstudio-126/c++ 12.6-1.0.0.0 i--
-# developer/developerstudio-126/cc 12.6-1.0.0.0 i--
-# developer/developerstudio-126/dbx (solarisstudio) 12.6-1.0.0.0 i--
-# developer/developerstudio-126/library/c++-libs 12.6-1.0.0.0 i--
-# developer/developerstudio-126/library/math-libs 12.6-1.0.0.0 i--
-# developer/developerstudio-126/library/c-libs 12.6-1.0.0.0 i--
-# developer/developerstudio-126/library/studio-gccrt 12.6-1.0.0.0 i--
-# developer/developerstudio-126/studio-common 12.6-1.0.0.0 i--
-# developer/developerstudio-126/studio-ja 12.6-1.0.0.0 i--
-# developer/developerstudio-126/studio-legal 12.6-1.0.0.0 i--
-# developer/developerstudio-126/studio-zhCN 12.6-1.0.0.0 i--
+#developer/developerstudio-126/backend 12.6-1.0.0.1
+#developer/developerstudio-126/c++ 12.6-1.0.2.0
+#developer/developerstudio-126/cc 12.6-1.0.1.0
+#developer/developerstudio-126/dbx 12.6-1.0.0.1
+#developer/developerstudio-126/library/c++-libs 12.6-1.0.2.0
+#developer/developerstudio-126/library/c-libs 12.6-1.0.0.1
+#developer/developerstudio-126/library/f90-libs 12.6-1.0.0.1
+#developer/developerstudio-126/library/math-libs 12.6-1.0.0.1
+#developer/developerstudio-126/library/studio-gccrt 12.6-1.0.0.1
+#developer/developerstudio-126/studio-common 12.6-1.0.0.1
+#developer/developerstudio-126/studio-ja 12.6-1.0.0.1
+#developer/developerstudio-126/studio-legal 12.6-1.0.0.1
+#developer/developerstudio-126/studio-zhCN 12.6-1.0.0.1
#
# erik.joelsson@oracle.com
@@ -93,7 +94,7 @@
pkg -R $INSTALL_ROOT set-publisher -P -g ${PUBLISHER_URI} solaris
sudo pkg -R $INSTALL_ROOT install --accept entire@$SOLARIS_ENTIRE_VERSION \
system/install developer/gnu-binutils system/library/mmheap system/picl \
- developer/assembler
+ developer/assembler system/library/freetype-2
else
echo "Skipping installing packages"
fi
--- a/make/launcher/LauncherCommon.gmk Wed Sep 26 18:36:55 2018 +0100
+++ b/make/launcher/LauncherCommon.gmk Thu Sep 27 10:49:10 2018 -0700
@@ -36,9 +36,7 @@
LAUNCHER_CFLAGS += -fvisibility=hidden
LDFLAGS_JDKEXE += -Wl,--exclude-libs,ALL
else ifeq ($(TOOLCHAIN_TYPE), clang)
- ifneq ($(OPENJDK_TARGET_OS), macosx)
- LAUNCHER_CFLAGS += -fvisibility=hidden
- endif
+ LAUNCHER_CFLAGS += -fvisibility=hidden
else ifeq ($(TOOLCHAIN_TYPE), solstudio)
LAUNCHER_CFLAGS += -xldscope=hidden
else ifeq ($(TOOLCHAIN_TYPE), xlc)
--- a/make/lib/CoreLibraries.gmk Wed Sep 26 18:36:55 2018 +0100
+++ b/make/lib/CoreLibraries.gmk Thu Sep 27 10:49:10 2018 -0700
@@ -244,7 +244,7 @@
EXCLUDE_FILES := $(LIBJLI_EXCLUDE_FILES), \
EXTRA_FILES := $(LIBJLI_EXTRA_FILES), \
OPTIMIZATION := HIGH, \
- CFLAGS := $(STATIC_LIBRARY_FLAGS) $(LIBJLI_CFLAGS_JDKLIB) $(LIBJLI_CFLAGS) \
+ CFLAGS := $(STATIC_LIBRARY_FLAGS) $(CFLAGS_JDKLIB) $(LIBJLI_CFLAGS) \
$(addprefix -I, $(LIBJLI_SRC_DIRS)), \
ARFLAGS := $(ARFLAGS), \
OBJECT_DIR := $(SUPPORT_OUTPUTDIR)/native/$(MODULE)/libjli_static))
--- a/make/lib/LibCommon.gmk Wed Sep 26 18:36:55 2018 +0100
+++ b/make/lib/LibCommon.gmk Thu Sep 27 10:49:10 2018 -0700
@@ -46,11 +46,9 @@
LDFLAGS_JDKLIB += -Wl,--exclude-libs,ALL
EXPORT_ALL_SYMBOLS := -fvisibility=default
else ifeq ($(TOOLCHAIN_TYPE), clang)
- ifneq ($(OPENJDK_TARGET_OS), macosx)
- CFLAGS_JDKLIB += -fvisibility=hidden
- CXXFLAGS_JDKLIB += -fvisibility=hidden
- EXPORT_ALL_SYMBOLS := -fvisibility=default
- endif
+ CFLAGS_JDKLIB += -fvisibility=hidden
+ CXXFLAGS_JDKLIB += -fvisibility=hidden
+ EXPORT_ALL_SYMBOLS := -fvisibility=default
else ifeq ($(TOOLCHAIN_TYPE), solstudio)
CFLAGS_JDKLIB += -xldscope=hidden
CXXFLAGS_JDKLIB += -xldscope=hidden
--- a/src/hotspot/cpu/aarch64/c1_LIRAssembler_aarch64.cpp Wed Sep 26 18:36:55 2018 +0100
+++ b/src/hotspot/cpu/aarch64/c1_LIRAssembler_aarch64.cpp Thu Sep 27 10:49:10 2018 -0700
@@ -1025,37 +1025,17 @@
return exact_log2(elem_size);
}
-void LIR_Assembler::arithmetic_idiv(LIR_Op3* op, bool is_irem) {
- Register Rdividend = op->in_opr1()->as_register();
- Register Rdivisor = op->in_opr2()->as_register();
- Register Rscratch = op->in_opr3()->as_register();
- Register Rresult = op->result_opr()->as_register();
- int divisor = -1;
-
- /*
- TODO: For some reason, using the Rscratch that gets passed in is
- not possible because the register allocator does not see the tmp reg
- as used, and assignes it the same register as Rdividend. We use rscratch1
- instead.
-
- assert(Rdividend != Rscratch, "");
- assert(Rdivisor != Rscratch, "");
- */
-
- if (Rdivisor == noreg && is_power_of_2(divisor)) {
- // convert division by a power of two into some shifts and logical operations
- }
-
- __ corrected_idivl(Rresult, Rdividend, Rdivisor, is_irem, rscratch1);
-}
void LIR_Assembler::emit_op3(LIR_Op3* op) {
switch (op->code()) {
case lir_idiv:
- arithmetic_idiv(op, false);
- break;
case lir_irem:
- arithmetic_idiv(op, true);
+ arithmetic_idiv(op->code(),
+ op->in_opr1(),
+ op->in_opr2(),
+ op->in_opr3(),
+ op->result_opr(),
+ op->info());
break;
case lir_fmad:
__ fmaddd(op->result_opr()->as_double_reg(),
@@ -1752,16 +1732,43 @@
}
} else if (right->is_constant()) {
- jlong c = right->as_constant_ptr()->as_jlong_bits();
+ jlong c = right->as_constant_ptr()->as_jlong();
Register dreg = as_reg(dest);
- assert(code == lir_add || code == lir_sub, "mismatched arithmetic op");
- if (c == 0 && dreg == lreg_lo) {
- COMMENT("effective nop elided");
- return;
- }
switch (code) {
- case lir_add: __ add(dreg, lreg_lo, c); break;
- case lir_sub: __ sub(dreg, lreg_lo, c); break;
+ case lir_add:
+ case lir_sub:
+ if (c == 0 && dreg == lreg_lo) {
+ COMMENT("effective nop elided");
+ return;
+ }
+ code == lir_add ? __ add(dreg, lreg_lo, c) : __ sub(dreg, lreg_lo, c);
+ break;
+ case lir_div:
+ assert(c > 0 && is_power_of_2_long(c), "divisor must be power-of-2 constant");
+ if (c == 1) {
+ // move lreg_lo to dreg if divisor is 1
+ __ mov(dreg, lreg_lo);
+ } else {
+ unsigned int shift = exact_log2_long(c);
+ // use rscratch1 as intermediate result register
+ __ asr(rscratch1, lreg_lo, 63);
+ __ add(rscratch1, lreg_lo, rscratch1, Assembler::LSR, 64 - shift);
+ __ asr(dreg, rscratch1, shift);
+ }
+ break;
+ case lir_rem:
+ assert(c > 0 && is_power_of_2_long(c), "divisor must be power-of-2 constant");
+ if (c == 1) {
+ // move 0 to dreg if divisor is 1
+ __ mov(dreg, zr);
+ } else {
+ // use rscratch1 as intermediate result register
+ __ negs(rscratch1, lreg_lo);
+ __ andr(dreg, lreg_lo, c - 1);
+ __ andr(rscratch1, rscratch1, c - 1);
+ __ csneg(dreg, dreg, rscratch1, Assembler::MI);
+ }
+ break;
default:
ShouldNotReachHere();
}
@@ -1862,7 +1869,51 @@
-void LIR_Assembler::arithmetic_idiv(LIR_Code code, LIR_Opr left, LIR_Opr right, LIR_Opr temp, LIR_Opr result, CodeEmitInfo* info) { Unimplemented(); }
+void LIR_Assembler::arithmetic_idiv(LIR_Code code, LIR_Opr left, LIR_Opr right, LIR_Opr illegal, LIR_Opr result, CodeEmitInfo* info) {
+
+ // opcode check
+ assert((code == lir_idiv) || (code == lir_irem), "opcode must be idiv or irem");
+ bool is_irem = (code == lir_irem);
+
+ // operand check
+ assert(left->is_single_cpu(), "left must be register");
+ assert(right->is_single_cpu() || right->is_constant(), "right must be register or constant");
+ assert(result->is_single_cpu(), "result must be register");
+ Register lreg = left->as_register();
+ Register dreg = result->as_register();
+
+ // power-of-2 constant check and codegen
+ if (right->is_constant()) {
+ int c = right->as_constant_ptr()->as_jint();
+ assert(c > 0 && is_power_of_2(c), "divisor must be power-of-2 constant");
+ if (is_irem) {
+ if (c == 1) {
+ // move 0 to dreg if divisor is 1
+ __ movw(dreg, zr);
+ } else {
+ // use rscratch1 as intermediate result register
+ __ negsw(rscratch1, lreg);
+ __ andw(dreg, lreg, c - 1);
+ __ andw(rscratch1, rscratch1, c - 1);
+ __ csnegw(dreg, dreg, rscratch1, Assembler::MI);
+ }
+ } else {
+ if (c == 1) {
+ // move lreg to dreg if divisor is 1
+ __ movw(dreg, lreg);
+ } else {
+ unsigned int shift = exact_log2(c);
+ // use rscratch1 as intermediate result register
+ __ asrw(rscratch1, lreg, 31);
+ __ addw(rscratch1, lreg, rscratch1, Assembler::LSR, 32 - shift);
+ __ asrw(dreg, rscratch1, shift);
+ }
+ }
+ } else {
+ Register rreg = right->as_register();
+ __ corrected_idivl(dreg, lreg, rreg, is_irem, rscratch1);
+ }
+}
void LIR_Assembler::comp_op(LIR_Condition condition, LIR_Opr opr1, LIR_Opr opr2, LIR_Op2* op) {
@@ -2792,7 +2843,10 @@
}
-void LIR_Assembler::negate(LIR_Opr left, LIR_Opr dest) {
+void LIR_Assembler::negate(LIR_Opr left, LIR_Opr dest, LIR_Opr tmp) {
+ // tmp must be unused
+ assert(tmp->is_illegal(), "wasting a register if tmp is allocated");
+
if (left->is_single_cpu()) {
assert(dest->is_single_cpu(), "expect single result reg");
__ negw(dest->as_register(), left->as_register());
--- a/src/hotspot/cpu/aarch64/c1_LIRAssembler_aarch64.hpp Wed Sep 26 18:36:55 2018 +0100
+++ b/src/hotspot/cpu/aarch64/c1_LIRAssembler_aarch64.hpp Thu Sep 27 10:49:10 2018 -0700
@@ -75,8 +75,6 @@
_deopt_handler_size = 7 * NativeInstruction::instruction_size
};
- void arithmetic_idiv(LIR_Op3* op, bool is_irem);
-
public:
void store_parameter(Register r, int offset_from_esp_in_words);
--- a/src/hotspot/cpu/aarch64/c1_LIRGenerator_aarch64.cpp Wed Sep 26 18:36:55 2018 +0100
+++ b/src/hotspot/cpu/aarch64/c1_LIRGenerator_aarch64.cpp Thu Sep 27 10:49:10 2018 -0700
@@ -440,17 +440,26 @@
if (x->op() == Bytecodes::_ldiv || x->op() == Bytecodes::_lrem) {
- // the check for division by zero destroys the right operand
- right.set_destroys_register();
-
- // check for division by zero (destroys registers of right operand!)
- CodeEmitInfo* info = state_for(x);
-
left.load_item();
- right.load_item();
-
- __ cmp(lir_cond_equal, right.result(), LIR_OprFact::longConst(0));
- __ branch(lir_cond_equal, T_LONG, new DivByZeroStub(info));
+ bool need_zero_check = true;
+ if (right.is_constant()) {
+ jlong c = right.get_jlong_constant();
+ // no need to do div-by-zero check if the divisor is a non-zero constant
+ if (c != 0) need_zero_check = false;
+ // do not load right if the divisor is a power-of-2 constant
+ if (c > 0 && is_power_of_2_long(c)) {
+ right.dont_load_item();
+ } else {
+ right.load_item();
+ }
+ } else {
+ right.load_item();
+ }
+ if (need_zero_check) {
+ CodeEmitInfo* info = state_for(x);
+ __ cmp(lir_cond_equal, right.result(), LIR_OprFact::longConst(0));
+ __ branch(lir_cond_equal, T_LONG, new DivByZeroStub(info));
+ }
rlock_result(x);
switch (x->op()) {
@@ -506,19 +515,32 @@
// do not need to load right, as we can handle stack and constants
if (x->op() == Bytecodes::_idiv || x->op() == Bytecodes::_irem) {
- right_arg->load_item();
rlock_result(x);
+ bool need_zero_check = true;
+ if (right.is_constant()) {
+ jint c = right.get_jint_constant();
+ // no need to do div-by-zero check if the divisor is a non-zero constant
+ if (c != 0) need_zero_check = false;
+ // do not load right if the divisor is a power-of-2 constant
+ if (c > 0 && is_power_of_2(c)) {
+ right_arg->dont_load_item();
+ } else {
+ right_arg->load_item();
+ }
+ } else {
+ right_arg->load_item();
+ }
+ if (need_zero_check) {
+ CodeEmitInfo* info = state_for(x);
+ __ cmp(lir_cond_equal, right_arg->result(), LIR_OprFact::longConst(0));
+ __ branch(lir_cond_equal, T_INT, new DivByZeroStub(info));
+ }
- CodeEmitInfo* info = state_for(x);
- LIR_Opr tmp = new_register(T_INT);
- __ cmp(lir_cond_equal, right_arg->result(), LIR_OprFact::longConst(0));
- __ branch(lir_cond_equal, T_INT, new DivByZeroStub(info));
- info = state_for(x);
-
+ LIR_Opr ill = LIR_OprFact::illegalOpr;
if (x->op() == Bytecodes::_irem) {
- __ irem(left_arg->result(), right_arg->result(), x->operand(), tmp, NULL);
+ __ irem(left_arg->result(), right_arg->result(), x->operand(), ill, NULL);
} else if (x->op() == Bytecodes::_idiv) {
- __ idiv(left_arg->result(), right_arg->result(), x->operand(), tmp, NULL);
+ __ idiv(left_arg->result(), right_arg->result(), x->operand(), ill, NULL);
}
} else if (x->op() == Bytecodes::_iadd || x->op() == Bytecodes::_isub) {
--- a/src/hotspot/cpu/aarch64/macroAssembler_aarch64.cpp Wed Sep 26 18:36:55 2018 +0100
+++ b/src/hotspot/cpu/aarch64/macroAssembler_aarch64.cpp Thu Sep 27 10:49:10 2018 -0700
@@ -822,6 +822,15 @@
return stub_start_addr;
}
+void MacroAssembler::c2bool(Register x) {
+ // implements x == 0 ? 0 : 1
+ // note: must only look at least-significant byte of x
+ // since C-style booleans are stored in one byte
+ // only! (was bug)
+ tst(x, 0xff);
+ cset(x, Assembler::NE);
+}
+
address MacroAssembler::ic_call(address entry, jint method_index) {
RelocationHolder rh = virtual_call_Relocation::spec(pc(), method_index);
// address const_ptr = long_constant((jlong)Universe::non_oop_word());
--- a/src/hotspot/cpu/aarch64/macroAssembler_aarch64.hpp Wed Sep 26 18:36:55 2018 +0100
+++ b/src/hotspot/cpu/aarch64/macroAssembler_aarch64.hpp Thu Sep 27 10:49:10 2018 -0700
@@ -782,6 +782,9 @@
void resolve_jobject(Register value, Register thread, Register tmp);
+ // C 'boolean' to Java boolean: x == 0 ? 0 : 1
+ void c2bool(Register x);
+
// oop manipulations
void load_klass(Register dst, Register src);
void store_klass(Register dst, Register src);
--- a/src/hotspot/cpu/aarch64/sharedRuntime_aarch64.cpp Wed Sep 26 18:36:55 2018 +0100
+++ b/src/hotspot/cpu/aarch64/sharedRuntime_aarch64.cpp Thu Sep 27 10:49:10 2018 -0700
@@ -1924,7 +1924,7 @@
// Unpack native results.
switch (ret_type) {
- case T_BOOLEAN: __ ubfx(r0, r0, 0, 8); break;
+ case T_BOOLEAN: __ c2bool(r0); break;
case T_CHAR : __ ubfx(r0, r0, 0, 16); break;
case T_BYTE : __ sbfx(r0, r0, 0, 8); break;
case T_SHORT : __ sbfx(r0, r0, 0, 16); break;
--- a/src/hotspot/cpu/aarch64/templateInterpreterGenerator_aarch64.cpp Wed Sep 26 18:36:55 2018 +0100
+++ b/src/hotspot/cpu/aarch64/templateInterpreterGenerator_aarch64.cpp Thu Sep 27 10:49:10 2018 -0700
@@ -557,7 +557,7 @@
BasicType type) {
address entry = __ pc();
switch (type) {
- case T_BOOLEAN: __ uxtb(r0, r0); break;
+ case T_BOOLEAN: __ c2bool(r0); break;
case T_CHAR : __ uxth(r0, r0); break;
case T_BYTE : __ sxtb(r0, r0); break;
case T_SHORT : __ sxth(r0, r0); break;
--- a/src/hotspot/cpu/arm/c1_LIRAssembler_arm.cpp Wed Sep 26 18:36:55 2018 +0100
+++ b/src/hotspot/cpu/arm/c1_LIRAssembler_arm.cpp Thu Sep 27 10:49:10 2018 -0700
@@ -3265,7 +3265,9 @@
}
-void LIR_Assembler::negate(LIR_Opr left, LIR_Opr dest) {
+void LIR_Assembler::negate(LIR_Opr left, LIR_Opr dest, LIR_Opr tmp) {
+ // tmp must be unused
+ assert(tmp->is_illegal(), "wasting a register if tmp is allocated");
if (left->is_single_cpu()) {
assert (dest->type() == T_INT, "unexpected result type");
--- a/src/hotspot/cpu/ppc/c1_LIRAssembler_ppc.cpp Wed Sep 26 18:36:55 2018 +0100
+++ b/src/hotspot/cpu/ppc/c1_LIRAssembler_ppc.cpp Thu Sep 27 10:49:10 2018 -0700
@@ -2840,7 +2840,9 @@
}
-void LIR_Assembler::negate(LIR_Opr left, LIR_Opr dest) {
+void LIR_Assembler::negate(LIR_Opr left, LIR_Opr dest, LIR_Opr tmp) {
+ // tmp must be unused
+ assert(tmp->is_illegal(), "wasting a register if tmp is allocated");
assert(left->is_register(), "can only handle registers");
if (left->is_single_cpu()) {
--- a/src/hotspot/cpu/s390/c1_LIRAssembler_s390.cpp Wed Sep 26 18:36:55 2018 +0100
+++ b/src/hotspot/cpu/s390/c1_LIRAssembler_s390.cpp Thu Sep 27 10:49:10 2018 -0700
@@ -2850,7 +2850,9 @@
ShouldNotCallThis(); // There are no delay slots on ZARCH_64.
}
-void LIR_Assembler::negate(LIR_Opr left, LIR_Opr dest) {
+void LIR_Assembler::negate(LIR_Opr left, LIR_Opr dest, LIR_Opr tmp) {
+ // tmp must be unused
+ assert(tmp->is_illegal(), "wasting a register if tmp is allocated");
assert(left->is_register(), "can only handle registers");
if (left->is_single_cpu()) {
--- a/src/hotspot/cpu/sparc/c1_LIRAssembler_sparc.cpp Wed Sep 26 18:36:55 2018 +0100
+++ b/src/hotspot/cpu/sparc/c1_LIRAssembler_sparc.cpp Thu Sep 27 10:49:10 2018 -0700
@@ -3024,7 +3024,9 @@
}
-void LIR_Assembler::negate(LIR_Opr left, LIR_Opr dest) {
+void LIR_Assembler::negate(LIR_Opr left, LIR_Opr dest, LIR_Opr tmp) {
+ // tmp must be unused
+ assert(tmp->is_illegal(), "wasting a register if tmp is allocated");
assert(left->is_register(), "can only handle registers");
if (left->is_single_cpu()) {
--- a/src/hotspot/cpu/x86/assembler_x86.cpp Wed Sep 26 18:36:55 2018 +0100
+++ b/src/hotspot/cpu/x86/assembler_x86.cpp Thu Sep 27 10:49:10 2018 -0700
@@ -2199,7 +2199,7 @@
void Assembler::movapd(XMMRegister dst, XMMRegister src) {
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
int vector_len = VM_Version::supports_avx512novl() ? AVX_512bit : AVX_128bit;
- InstructionAttr attributes(vector_len, /* rex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ false);
+ InstructionAttr attributes(vector_len, /* rex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);
attributes.set_rex_vex_w_reverted();
int encode = simd_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);
emit_int8(0x28);
@@ -2209,7 +2209,7 @@
void Assembler::movaps(XMMRegister dst, XMMRegister src) {
NOT_LP64(assert(VM_Version::supports_sse(), ""));
int vector_len = VM_Version::supports_avx512novl() ? AVX_512bit : AVX_128bit;
- InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ false);
+ InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);
int encode = simd_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_NONE, VEX_OPCODE_0F, &attributes);
emit_int8(0x28);
emit_int8((unsigned char)(0xC0 | encode));
@@ -2217,7 +2217,7 @@
void Assembler::movlhps(XMMRegister dst, XMMRegister src) {
NOT_LP64(assert(VM_Version::supports_sse(), ""));
- InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);
+ InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);
int encode = simd_prefix_and_encode(dst, src, src, VEX_SIMD_NONE, VEX_OPCODE_0F, &attributes);
emit_int8(0x16);
emit_int8((unsigned char)(0xC0 | encode));
@@ -2465,8 +2465,7 @@
void Assembler::movdqa(XMMRegister dst, XMMRegister src) {
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
- int vector_len = VM_Version::supports_avx512novl() ? AVX_512bit : AVX_128bit;
- InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);
+ InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);
int encode = simd_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);
emit_int8(0x6F);
emit_int8((unsigned char)(0xC0 | encode));
@@ -2583,7 +2582,7 @@
assert(VM_Version::supports_avx512vlbw(), "");
assert(is_vector_masking(), ""); // For stub code use only
InstructionMark im(this);
- InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ false, /* uses_vl */ true);
+ InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);
attributes.set_address_attributes(/* tuple_type */ EVEX_FVM, /* input_size_in_bits */ EVEX_NObit);
attributes.set_embedded_opmask_register_specifier(mask);
attributes.set_is_evex_instruction();
@@ -2608,7 +2607,7 @@
assert(is_vector_masking(), "");
assert(VM_Version::supports_avx512vlbw(), "");
InstructionMark im(this);
- InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ false, /* uses_vl */ true);
+ InstructionAttr attributes(vector_len, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);
attributes.set_address_attributes(/* tuple_type */ EVEX_FVM, /* input_size_in_bits */ EVEX_NObit);
attributes.set_embedded_opmask_register_specifier(mask);
attributes.set_is_evex_instruction();
@@ -2752,7 +2751,7 @@
void Assembler::movlpd(XMMRegister dst, Address src) {
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
InstructionMark im(this);
- InstructionAttr attributes(AVX_128bit, /* rex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);
+ InstructionAttr attributes(AVX_128bit, /* rex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);
attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_64bit);
attributes.set_rex_vex_w_reverted();
simd_prefix(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);
@@ -3512,7 +3511,7 @@
void Assembler::evpcmpgtb(KRegister kdst, XMMRegister nds, Address src, int vector_len) {
assert(VM_Version::supports_avx512vlbw(), "");
InstructionMark im(this);
- InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);
+ InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);
attributes.set_address_attributes(/* tuple_type */ EVEX_FVM, /* input_size_in_bits */ EVEX_NObit);
attributes.set_is_evex_instruction();
int dst_enc = kdst->encoding();
@@ -3525,7 +3524,7 @@
assert(is_vector_masking(), "");
assert(VM_Version::supports_avx512vlbw(), "");
InstructionMark im(this);
- InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ false);
+ InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);
attributes.set_address_attributes(/* tuple_type */ EVEX_FVM, /* input_size_in_bits */ EVEX_NObit);
attributes.reset_is_clear_context();
attributes.set_embedded_opmask_register_specifier(mask);
@@ -3538,7 +3537,7 @@
void Assembler::evpcmpuw(KRegister kdst, XMMRegister nds, XMMRegister src, ComparisonPredicate vcc, int vector_len) {
assert(VM_Version::supports_avx512vlbw(), "");
- InstructionAttr attributes(vector_len, /* rex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);
+ InstructionAttr attributes(vector_len, /* rex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);
attributes.set_is_evex_instruction();
int encode = vex_prefix_and_encode(kdst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);
emit_int8(0x3E);
@@ -3549,7 +3548,7 @@
void Assembler::evpcmpuw(KRegister kdst, KRegister mask, XMMRegister nds, XMMRegister src, ComparisonPredicate vcc, int vector_len) {
assert(is_vector_masking(), "");
assert(VM_Version::supports_avx512vlbw(), "");
- InstructionAttr attributes(vector_len, /* rex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ false);
+ InstructionAttr attributes(vector_len, /* rex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);
attributes.reset_is_clear_context();
attributes.set_embedded_opmask_register_specifier(mask);
attributes.set_is_evex_instruction();
@@ -3562,7 +3561,7 @@
void Assembler::evpcmpuw(KRegister kdst, XMMRegister nds, Address src, ComparisonPredicate vcc, int vector_len) {
assert(VM_Version::supports_avx512vlbw(), "");
InstructionMark im(this);
- InstructionAttr attributes(vector_len, /* rex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);
+ InstructionAttr attributes(vector_len, /* rex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);
attributes.set_address_attributes(/* tuple_type */ EVEX_FVM, /* input_size_in_bits */ EVEX_NObit);
attributes.set_is_evex_instruction();
int dst_enc = kdst->encoding();
@@ -3575,7 +3574,7 @@
void Assembler::evpcmpeqb(KRegister kdst, XMMRegister nds, Address src, int vector_len) {
assert(VM_Version::supports_avx512bw(), "");
InstructionMark im(this);
- InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);
+ InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);
attributes.set_is_evex_instruction();
attributes.set_address_attributes(/* tuple_type */ EVEX_FVM, /* input_size_in_bits */ EVEX_NObit);
int dst_enc = kdst->encoding();
@@ -3588,7 +3587,7 @@
assert(VM_Version::supports_avx512vlbw(), "");
assert(is_vector_masking(), ""); // For stub code use only
InstructionMark im(this);
- InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_reg_mask */ false, /* uses_vl */ false);
+ InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_reg_mask */ false, /* uses_vl */ true);
attributes.set_address_attributes(/* tuple_type */ EVEX_FVM, /* input_size_in_bits */ EVEX_NObit);
attributes.reset_is_clear_context();
attributes.set_embedded_opmask_register_specifier(mask);
@@ -3741,7 +3740,7 @@
void Assembler::pextrd(Register dst, XMMRegister src, int imm8) {
assert(VM_Version::supports_sse4_1(), "");
- InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_dq, /* no_mask_reg */ true, /* uses_vl */ false);
+ InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_dq, /* no_mask_reg */ true, /* uses_vl */ true);
int encode = simd_prefix_and_encode(src, xnoreg, as_XMMRegister(dst->encoding()), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);
emit_int8(0x16);
emit_int8((unsigned char)(0xC0 | encode));
@@ -3750,7 +3749,7 @@
void Assembler::pextrd(Address dst, XMMRegister src, int imm8) {
assert(VM_Version::supports_sse4_1(), "");
- InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_dq, /* no_mask_reg */ true, /* uses_vl */ false);
+ InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_dq, /* no_mask_reg */ true, /* uses_vl */ true);
attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_32bit);
simd_prefix(src, xnoreg, dst, VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);
emit_int8(0x16);
@@ -3760,7 +3759,7 @@
void Assembler::pextrq(Register dst, XMMRegister src, int imm8) {
assert(VM_Version::supports_sse4_1(), "");
- InstructionAttr attributes(AVX_128bit, /* rex_w */ true, /* legacy_mode */ _legacy_mode_dq, /* no_mask_reg */ true, /* uses_vl */ false);
+ InstructionAttr attributes(AVX_128bit, /* rex_w */ true, /* legacy_mode */ _legacy_mode_dq, /* no_mask_reg */ true, /* uses_vl */ true);
int encode = simd_prefix_and_encode(src, xnoreg, as_XMMRegister(dst->encoding()), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);
emit_int8(0x16);
emit_int8((unsigned char)(0xC0 | encode));
@@ -3769,7 +3768,7 @@
void Assembler::pextrq(Address dst, XMMRegister src, int imm8) {
assert(VM_Version::supports_sse4_1(), "");
- InstructionAttr attributes(AVX_128bit, /* rex_w */ true, /* legacy_mode */ _legacy_mode_dq, /* no_mask_reg */ true, /* uses_vl */ false);
+ InstructionAttr attributes(AVX_128bit, /* rex_w */ true, /* legacy_mode */ _legacy_mode_dq, /* no_mask_reg */ true, /* uses_vl */ true);
attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_64bit);
simd_prefix(src, xnoreg, dst, VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);
emit_int8(0x16);
@@ -3779,7 +3778,7 @@
void Assembler::pextrw(Register dst, XMMRegister src, int imm8) {
assert(VM_Version::supports_sse2(), "");
- InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ false);
+ InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);
int encode = simd_prefix_and_encode(as_XMMRegister(dst->encoding()), xnoreg, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);
emit_int8((unsigned char)0xC5);
emit_int8((unsigned char)(0xC0 | encode));
@@ -3788,7 +3787,7 @@
void Assembler::pextrw(Address dst, XMMRegister src, int imm8) {
assert(VM_Version::supports_sse4_1(), "");
- InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ false);
+ InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);
attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_16bit);
simd_prefix(src, xnoreg, dst, VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);
emit_int8((unsigned char)0x15);
@@ -3798,7 +3797,7 @@
void Assembler::pextrb(Address dst, XMMRegister src, int imm8) {
assert(VM_Version::supports_sse4_1(), "");
- InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ false);
+ InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);
attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_8bit);
simd_prefix(src, xnoreg, dst, VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);
emit_int8(0x14);
@@ -3808,7 +3807,7 @@
void Assembler::pinsrd(XMMRegister dst, Register src, int imm8) {
assert(VM_Version::supports_sse4_1(), "");
- InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_dq, /* no_mask_reg */ true, /* uses_vl */ false);
+ InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_dq, /* no_mask_reg */ true, /* uses_vl */ true);
int encode = simd_prefix_and_encode(dst, dst, as_XMMRegister(src->encoding()), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);
emit_int8(0x22);
emit_int8((unsigned char)(0xC0 | encode));
@@ -3817,7 +3816,7 @@
void Assembler::pinsrd(XMMRegister dst, Address src, int imm8) {
assert(VM_Version::supports_sse4_1(), "");
- InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_dq, /* no_mask_reg */ true, /* uses_vl */ false);
+ InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_dq, /* no_mask_reg */ true, /* uses_vl */ true);
attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_32bit);
simd_prefix(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);
emit_int8(0x22);
@@ -3827,7 +3826,7 @@
void Assembler::pinsrq(XMMRegister dst, Register src, int imm8) {
assert(VM_Version::supports_sse4_1(), "");
- InstructionAttr attributes(AVX_128bit, /* rex_w */ true, /* legacy_mode */ _legacy_mode_dq, /* no_mask_reg */ true, /* uses_vl */ false);
+ InstructionAttr attributes(AVX_128bit, /* rex_w */ true, /* legacy_mode */ _legacy_mode_dq, /* no_mask_reg */ true, /* uses_vl */ true);
int encode = simd_prefix_and_encode(dst, dst, as_XMMRegister(src->encoding()), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);
emit_int8(0x22);
emit_int8((unsigned char)(0xC0 | encode));
@@ -3836,7 +3835,7 @@
void Assembler::pinsrq(XMMRegister dst, Address src, int imm8) {
assert(VM_Version::supports_sse4_1(), "");
- InstructionAttr attributes(AVX_128bit, /* rex_w */ true, /* legacy_mode */ _legacy_mode_dq, /* no_mask_reg */ true, /* uses_vl */ false);
+ InstructionAttr attributes(AVX_128bit, /* rex_w */ true, /* legacy_mode */ _legacy_mode_dq, /* no_mask_reg */ true, /* uses_vl */ true);
attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_64bit);
simd_prefix(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);
emit_int8(0x22);
@@ -3846,7 +3845,7 @@
void Assembler::pinsrw(XMMRegister dst, Register src, int imm8) {
assert(VM_Version::supports_sse2(), "");
- InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ false);
+ InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);
int encode = simd_prefix_and_encode(dst, dst, as_XMMRegister(src->encoding()), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);
emit_int8((unsigned char)0xC4);
emit_int8((unsigned char)(0xC0 | encode));
@@ -3855,7 +3854,7 @@
void Assembler::pinsrw(XMMRegister dst, Address src, int imm8) {
assert(VM_Version::supports_sse2(), "");
- InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ false);
+ InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);
attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_16bit);
simd_prefix(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);
emit_int8((unsigned char)0xC4);
@@ -3865,7 +3864,7 @@
void Assembler::pinsrb(XMMRegister dst, Address src, int imm8) {
assert(VM_Version::supports_sse4_1(), "");
- InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ false);
+ InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);
attributes.set_address_attributes(/* tuple_type */ EVEX_T1S, /* input_size_in_bits */ EVEX_8bit);
simd_prefix(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);
emit_int8(0x20);
@@ -3876,7 +3875,7 @@
void Assembler::pmovzxbw(XMMRegister dst, Address src) {
assert(VM_Version::supports_sse4_1(), "");
InstructionMark im(this);
- InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ false);
+ InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);
attributes.set_address_attributes(/* tuple_type */ EVEX_HVM, /* input_size_in_bits */ EVEX_NObit);
simd_prefix(dst, xnoreg, src, VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);
emit_int8(0x30);
@@ -3885,7 +3884,7 @@
void Assembler::pmovzxbw(XMMRegister dst, XMMRegister src) {
assert(VM_Version::supports_sse4_1(), "");
- InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ false);
+ InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);
int encode = simd_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);
emit_int8(0x30);
emit_int8((unsigned char)(0xC0 | encode));
@@ -3895,7 +3894,7 @@
assert(VM_Version::supports_avx(), "");
InstructionMark im(this);
assert(dst != xnoreg, "sanity");
- InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ false);
+ InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);
attributes.set_address_attributes(/* tuple_type */ EVEX_HVM, /* input_size_in_bits */ EVEX_NObit);
vex_prefix(src, 0, dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);
emit_int8(0x30);
@@ -3906,7 +3905,7 @@
assert(vector_len == AVX_128bit? VM_Version::supports_avx() :
vector_len == AVX_256bit? VM_Version::supports_avx2() :
vector_len == AVX_512bit? VM_Version::supports_avx512bw() : 0, "");
- InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ false);
+ InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);
int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);
emit_int8(0x30);
emit_int8((unsigned char) (0xC0 | encode));
@@ -3918,7 +3917,7 @@
assert(VM_Version::supports_avx512vlbw(), "");
assert(dst != xnoreg, "sanity");
InstructionMark im(this);
- InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ false);
+ InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);
attributes.set_address_attributes(/* tuple_type */ EVEX_HVM, /* input_size_in_bits */ EVEX_NObit);
attributes.set_embedded_opmask_register_specifier(mask);
attributes.set_is_evex_instruction();
@@ -3930,7 +3929,7 @@
assert(VM_Version::supports_avx512vlbw(), "");
assert(src != xnoreg, "sanity");
InstructionMark im(this);
- InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);
+ InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);
attributes.set_address_attributes(/* tuple_type */ EVEX_HVM, /* input_size_in_bits */ EVEX_NObit);
attributes.set_is_evex_instruction();
vex_prefix(dst, 0, src->encoding(), VEX_SIMD_F3, VEX_OPCODE_0F_38, &attributes);
@@ -3943,7 +3942,7 @@
assert(VM_Version::supports_avx512vlbw(), "");
assert(src != xnoreg, "sanity");
InstructionMark im(this);
- InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ false);
+ InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);
attributes.set_address_attributes(/* tuple_type */ EVEX_HVM, /* input_size_in_bits */ EVEX_NObit);
attributes.reset_is_clear_context();
attributes.set_embedded_opmask_register_specifier(mask);
@@ -3957,7 +3956,7 @@
assert(VM_Version::supports_evex(), "");
assert(src != xnoreg, "sanity");
InstructionMark im(this);
- InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ false);
+ InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ true, /* uses_vl */ true);
attributes.set_address_attributes(/* tuple_type */ EVEX_QVM, /* input_size_in_bits */ EVEX_NObit);
attributes.set_is_evex_instruction();
vex_prefix(dst, 0, src->encoding(), VEX_SIMD_F3, VEX_OPCODE_0F_38, &attributes);
@@ -3969,7 +3968,7 @@
assert(vector_len == AVX_128bit? VM_Version::supports_avx() :
vector_len == AVX_256bit? VM_Version::supports_avx2() :
vector_len == AVX_512bit? VM_Version::supports_evex() : 0, " ");
- InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ false);
+ InstructionAttr attributes(vector_len, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);
int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);
emit_int8(0x33);
emit_int8((unsigned char)(0xC0 | encode));
@@ -4082,7 +4081,7 @@
void Assembler::pshufb(XMMRegister dst, XMMRegister src) {
assert(VM_Version::supports_ssse3(), "");
- InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ false);
+ InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);
int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);
emit_int8(0x00);
emit_int8((unsigned char)(0xC0 | encode));
@@ -4101,7 +4100,7 @@
void Assembler::pshufb(XMMRegister dst, Address src) {
assert(VM_Version::supports_ssse3(), "");
InstructionMark im(this);
- InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ false);
+ InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);
attributes.set_address_attributes(/* tuple_type */ EVEX_FVM, /* input_size_in_bits */ EVEX_NObit);
simd_prefix(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);
emit_int8(0x00);
@@ -4147,7 +4146,7 @@
void Assembler::pshuflw(XMMRegister dst, XMMRegister src, int mode) {
assert(isByte(mode), "invalid value");
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
- InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ false);
+ InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);
int encode = simd_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_F2, VEX_OPCODE_0F, &attributes);
emit_int8(0x70);
emit_int8((unsigned char)(0xC0 | encode));
@@ -4159,7 +4158,7 @@
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
assert((UseAVX > 0), "SSE mode requires address alignment 16 bytes");
InstructionMark im(this);
- InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ false);
+ InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);
attributes.set_address_attributes(/* tuple_type */ EVEX_FVM, /* input_size_in_bits */ EVEX_NObit);
simd_prefix(dst, xnoreg, src, VEX_SIMD_F2, VEX_OPCODE_0F, &attributes);
emit_int8(0x70);
@@ -4180,7 +4179,7 @@
void Assembler::psrldq(XMMRegister dst, int shift) {
// Shift left 128 bit value in dst XMMRegister by shift number of bytes.
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
- InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ false);
+ InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);
int encode = simd_prefix_and_encode(xmm3, dst, dst, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);
emit_int8(0x73);
emit_int8((unsigned char)(0xC0 | encode));
@@ -4190,7 +4189,7 @@
void Assembler::pslldq(XMMRegister dst, int shift) {
// Shift left 128 bit value in dst XMMRegister by shift number of bytes.
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
- InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ false);
+ InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);
// XMM7 is for /7 encoding: 66 0F 73 /7 ib
int encode = simd_prefix_and_encode(xmm7, dst, dst, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);
emit_int8(0x73);
@@ -4456,7 +4455,7 @@
void Assembler::palignr(XMMRegister dst, XMMRegister src, int imm8) {
assert(VM_Version::supports_ssse3(), "");
- InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ false, /* uses_vl */ false);
+ InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ false, /* uses_vl */ true);
int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);
emit_int8((unsigned char)0x0F);
emit_int8((unsigned char)(0xC0 | encode));
@@ -4477,6 +4476,7 @@
void Assembler::evalignq(XMMRegister dst, XMMRegister nds, XMMRegister src, uint8_t imm8) {
assert(VM_Version::supports_evex(), "");
InstructionAttr attributes(AVX_512bit, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);
+ attributes.set_is_evex_instruction();
int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);
emit_int8(0x3);
emit_int8((unsigned char)(0xC0 | encode));
@@ -5591,7 +5591,7 @@
void Assembler::vphaddw(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {
assert(VM_Version::supports_avx() && (vector_len == 0) ||
VM_Version::supports_avx2(), "256 bit integer vectors requires AVX2");
- InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);
+ InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ true);
int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);
emit_int8(0x01);
emit_int8((unsigned char)(0xC0 | encode));
@@ -5600,7 +5600,7 @@
void Assembler::vphaddd(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {
assert(VM_Version::supports_avx() && (vector_len == 0) ||
VM_Version::supports_avx2(), "256 bit integer vectors requires AVX2");
- InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ false, /* uses_vl */ false);
+ InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ false, /* uses_vl */ true);
int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);
emit_int8(0x02);
emit_int8((unsigned char)(0xC0 | encode));
@@ -5650,7 +5650,7 @@
void Assembler::phaddw(XMMRegister dst, XMMRegister src) {
assert(VM_Version::supports_sse3(), "");
- InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);
+ InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ true);
int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);
emit_int8(0x01);
emit_int8((unsigned char)(0xC0 | encode));
@@ -5658,7 +5658,7 @@
void Assembler::phaddd(XMMRegister dst, XMMRegister src) {
assert(VM_Version::supports_sse3(), "");
- InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ false, /* uses_vl */ false);
+ InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ false, /* uses_vl */ true);
int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);
emit_int8(0x02);
emit_int8((unsigned char)(0xC0 | encode));
@@ -6281,6 +6281,15 @@
emit_int8((unsigned char)(0xC0 | encode));
}
+void Assembler::vpandn(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {
+ assert(UseAVX > 0, "requires some form of AVX");
+ InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);
+ int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F, &attributes);
+ emit_int8((unsigned char)0xDF);
+ emit_int8((unsigned char)(0xC0 | encode));
+}
+
+
void Assembler::por(XMMRegister dst, XMMRegister src) {
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
InstructionAttr attributes(AVX_128bit, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);
@@ -6369,8 +6378,7 @@
void Assembler::vinserti128(XMMRegister dst, XMMRegister nds, XMMRegister src, uint8_t imm8) {
assert(VM_Version::supports_avx2(), "");
assert(imm8 <= 0x01, "imm8: %u", imm8);
- int vector_len = VM_Version::supports_avx512novl() ? AVX_512bit : AVX_256bit;
- InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ false);
+ InstructionAttr attributes(AVX_256bit, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);
int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);
emit_int8(0x38);
emit_int8((unsigned char)(0xC0 | encode));
@@ -6383,9 +6391,8 @@
assert(VM_Version::supports_avx2(), "");
assert(dst != xnoreg, "sanity");
assert(imm8 <= 0x01, "imm8: %u", imm8);
- int vector_len = VM_Version::supports_avx512novl() ? AVX_512bit : AVX_256bit;
- InstructionMark im(this);
- InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ false);
+ InstructionMark im(this);
+ InstructionAttr attributes(AVX_256bit, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);
attributes.set_address_attributes(/* tuple_type */ EVEX_T4, /* input_size_in_bits */ EVEX_32bit);
vex_prefix(src, nds->encoding(), dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);
emit_int8(0x38);
@@ -6398,7 +6405,8 @@
void Assembler::vinserti32x4(XMMRegister dst, XMMRegister nds, XMMRegister src, uint8_t imm8) {
assert(VM_Version::supports_evex(), "");
assert(imm8 <= 0x03, "imm8: %u", imm8);
- InstructionAttr attributes(AVX_512bit, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ false);
+ InstructionAttr attributes(AVX_512bit, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);
+ attributes.set_is_evex_instruction();
int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);
emit_int8(0x38);
emit_int8((unsigned char)(0xC0 | encode));
@@ -6413,10 +6421,10 @@
assert(VM_Version::supports_avx(), "");
assert(dst != xnoreg, "sanity");
assert(imm8 <= 0x03, "imm8: %u", imm8);
- int vector_len = VM_Version::supports_evex() ? AVX_512bit : AVX_256bit;
- InstructionMark im(this);
- InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ false);
+ InstructionMark im(this);
+ InstructionAttr attributes(AVX_512bit, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);
attributes.set_address_attributes(/* tuple_type */ EVEX_T4, /* input_size_in_bits */ EVEX_32bit);
+ attributes.set_is_evex_instruction();
vex_prefix(src, nds->encoding(), dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);
emit_int8(0x18);
emit_operand(dst, src);
@@ -6430,9 +6438,10 @@
void Assembler::vinserti64x4(XMMRegister dst, XMMRegister nds, XMMRegister src, uint8_t imm8) {
assert(VM_Version::supports_evex(), "");
assert(imm8 <= 0x01, "imm8: %u", imm8);
- InstructionAttr attributes(AVX_512bit, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ false);
+ InstructionAttr attributes(AVX_512bit, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);
+ attributes.set_is_evex_instruction();
int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);
- emit_int8(0x38);
+ emit_int8(0x3A);
emit_int8((unsigned char)(0xC0 | encode));
// 0x00 - insert into lower 256 bits
// 0x01 - insert into upper 256 bits
@@ -6445,8 +6454,7 @@
void Assembler::vinsertf128(XMMRegister dst, XMMRegister nds, XMMRegister src, uint8_t imm8) {
assert(VM_Version::supports_avx(), "");
assert(imm8 <= 0x01, "imm8: %u", imm8);
- int vector_len = VM_Version::supports_avx512novl() ? AVX_512bit : AVX_256bit;
- InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ false);
+ InstructionAttr attributes(AVX_256bit, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);
int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);
emit_int8(0x18);
emit_int8((unsigned char)(0xC0 | encode));
@@ -6459,9 +6467,8 @@
assert(VM_Version::supports_avx(), "");
assert(dst != xnoreg, "sanity");
assert(imm8 <= 0x01, "imm8: %u", imm8);
- int vector_len = VM_Version::supports_avx512novl() ? AVX_512bit : AVX_256bit;
- InstructionMark im(this);
- InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ false);
+ InstructionMark im(this);
+ InstructionAttr attributes(AVX_256bit, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);
attributes.set_address_attributes(/* tuple_type */ EVEX_T4, /* input_size_in_bits */ EVEX_32bit);
vex_prefix(src, nds->encoding(), dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);
emit_int8(0x18);
@@ -6472,16 +6479,16 @@
}
void Assembler::vinsertf32x4(XMMRegister dst, XMMRegister nds, XMMRegister src, uint8_t imm8) {
- assert(VM_Version::supports_evex(), "");
+ assert(VM_Version::supports_avx2(), "");
assert(imm8 <= 0x03, "imm8: %u", imm8);
- InstructionAttr attributes(AVX_512bit, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ false);
+ InstructionAttr attributes(AVX_512bit, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);
int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);
emit_int8(0x18);
emit_int8((unsigned char)(0xC0 | encode));
// 0x00 - insert into q0 128 bits (0..127)
// 0x01 - insert into q1 128 bits (128..255)
- // 0x02 - insert into q2 128 bits (256..383)
- // 0x03 - insert into q3 128 bits (384..511)
+ // 0x02 - insert into q0 128 bits (256..383)
+ // 0x03 - insert into q1 128 bits (384..512)
emit_int8(imm8 & 0x03);
}
@@ -6489,24 +6496,24 @@
assert(VM_Version::supports_avx(), "");
assert(dst != xnoreg, "sanity");
assert(imm8 <= 0x03, "imm8: %u", imm8);
- int vector_len = VM_Version::supports_evex() ? AVX_512bit : AVX_256bit;
- InstructionMark im(this);
- InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ false);
+ InstructionMark im(this);
+ InstructionAttr attributes(AVX_512bit, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);
attributes.set_address_attributes(/* tuple_type */ EVEX_T4, /* input_size_in_bits */ EVEX_32bit);
vex_prefix(src, nds->encoding(), dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);
emit_int8(0x18);
emit_operand(dst, src);
// 0x00 - insert into q0 128 bits (0..127)
// 0x01 - insert into q1 128 bits (128..255)
- // 0x02 - insert into q2 128 bits (256..383)
- // 0x03 - insert into q3 128 bits (384..511)
+ // 0x02 - insert into q0 128 bits (256..383)
+ // 0x03 - insert into q1 128 bits (384..512)
emit_int8(imm8 & 0x03);
}
void Assembler::vinsertf64x4(XMMRegister dst, XMMRegister nds, XMMRegister src, uint8_t imm8) {
assert(VM_Version::supports_evex(), "");
assert(imm8 <= 0x01, "imm8: %u", imm8);
- InstructionAttr attributes(AVX_512bit, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ false);
+ InstructionAttr attributes(AVX_512bit, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);
+ attributes.set_is_evex_instruction();
int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);
emit_int8(0x1A);
emit_int8((unsigned char)(0xC0 | encode));
@@ -6520,8 +6527,9 @@
assert(dst != xnoreg, "sanity");
assert(imm8 <= 0x01, "imm8: %u", imm8);
InstructionMark im(this);
- InstructionAttr attributes(AVX_512bit, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ false);
+ InstructionAttr attributes(AVX_512bit, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);
attributes.set_address_attributes(/* tuple_type */ EVEX_T4, /* input_size_in_bits */ EVEX_64bit);
+ attributes.set_is_evex_instruction();
vex_prefix(src, nds->encoding(), dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);
emit_int8(0x1A);
emit_operand(dst, src);
@@ -6534,10 +6542,9 @@
// vextracti forms
void Assembler::vextracti128(XMMRegister dst, XMMRegister src, uint8_t imm8) {
- assert(VM_Version::supports_avx(), "");
+ assert(VM_Version::supports_avx2(), "");
assert(imm8 <= 0x01, "imm8: %u", imm8);
- int vector_len = VM_Version::supports_avx512novl() ? AVX_512bit : AVX_256bit;
- InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ false);
+ InstructionAttr attributes(AVX_256bit, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);
int encode = vex_prefix_and_encode(src->encoding(), 0, dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);
emit_int8(0x39);
emit_int8((unsigned char)(0xC0 | encode));
@@ -6550,9 +6557,8 @@
assert(VM_Version::supports_avx2(), "");
assert(src != xnoreg, "sanity");
assert(imm8 <= 0x01, "imm8: %u", imm8);
- int vector_len = VM_Version::supports_avx512novl() ? AVX_512bit : AVX_256bit;
- InstructionMark im(this);
- InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ false);
+ InstructionMark im(this);
+ InstructionAttr attributes(AVX_256bit, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);
attributes.set_address_attributes(/* tuple_type */ EVEX_T4, /* input_size_in_bits */ EVEX_32bit);
attributes.reset_is_clear_context();
vex_prefix(dst, 0, src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);
@@ -6564,10 +6570,10 @@
}
void Assembler::vextracti32x4(XMMRegister dst, XMMRegister src, uint8_t imm8) {
- assert(VM_Version::supports_avx(), "");
+ assert(VM_Version::supports_evex(), "");
assert(imm8 <= 0x03, "imm8: %u", imm8);
- int vector_len = VM_Version::supports_evex() ? AVX_512bit : AVX_256bit;
- InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ false);
+ InstructionAttr attributes(AVX_512bit, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);
+ attributes.set_is_evex_instruction();
int encode = vex_prefix_and_encode(src->encoding(), 0, dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);
emit_int8(0x39);
emit_int8((unsigned char)(0xC0 | encode));
@@ -6583,9 +6589,10 @@
assert(src != xnoreg, "sanity");
assert(imm8 <= 0x03, "imm8: %u", imm8);
InstructionMark im(this);
- InstructionAttr attributes(AVX_512bit, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ false);
+ InstructionAttr attributes(AVX_512bit, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);
attributes.set_address_attributes(/* tuple_type */ EVEX_T4, /* input_size_in_bits */ EVEX_32bit);
attributes.reset_is_clear_context();
+ attributes.set_is_evex_instruction();
vex_prefix(dst, 0, src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);
emit_int8(0x39);
emit_operand(src, dst);
@@ -6599,7 +6606,8 @@
void Assembler::vextracti64x2(XMMRegister dst, XMMRegister src, uint8_t imm8) {
assert(VM_Version::supports_avx512dq(), "");
assert(imm8 <= 0x03, "imm8: %u", imm8);
- InstructionAttr attributes(AVX_512bit, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ false);
+ InstructionAttr attributes(AVX_512bit, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);
+ attributes.set_is_evex_instruction();
int encode = vex_prefix_and_encode(src->encoding(), 0, dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);
emit_int8(0x39);
emit_int8((unsigned char)(0xC0 | encode));
@@ -6613,7 +6621,8 @@
void Assembler::vextracti64x4(XMMRegister dst, XMMRegister src, uint8_t imm8) {
assert(VM_Version::supports_evex(), "");
assert(imm8 <= 0x01, "imm8: %u", imm8);
- InstructionAttr attributes(AVX_512bit, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ false);
+ InstructionAttr attributes(AVX_512bit, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);
+ attributes.set_is_evex_instruction();
int encode = vex_prefix_and_encode(src->encoding(), 0, dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);
emit_int8(0x3B);
emit_int8((unsigned char)(0xC0 | encode));
@@ -6622,14 +6631,28 @@
emit_int8(imm8 & 0x01);
}
-
+void Assembler::vextracti64x4(Address dst, XMMRegister src, uint8_t imm8) {
+ assert(VM_Version::supports_evex(), "");
+ assert(src != xnoreg, "sanity");
+ assert(imm8 <= 0x01, "imm8: %u", imm8);
+ InstructionMark im(this);
+ InstructionAttr attributes(AVX_512bit, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);
+ attributes.set_address_attributes(/* tuple_type */ EVEX_T4, /* input_size_in_bits */ EVEX_64bit);
+ attributes.reset_is_clear_context();
+ attributes.set_is_evex_instruction();
+ vex_prefix(dst, 0, src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);
+ emit_int8(0x38);
+ emit_operand(src, dst);
+ // 0x00 - extract from lower 256 bits
+ // 0x01 - extract from upper 256 bits
+ emit_int8(imm8 & 0x01);
+}
// vextractf forms
void Assembler::vextractf128(XMMRegister dst, XMMRegister src, uint8_t imm8) {
assert(VM_Version::supports_avx(), "");
assert(imm8 <= 0x01, "imm8: %u", imm8);
- int vector_len = VM_Version::supports_avx512novl() ? AVX_512bit : AVX_256bit;
- InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ false);
+ InstructionAttr attributes(AVX_256bit, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);
int encode = vex_prefix_and_encode(src->encoding(), 0, dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);
emit_int8(0x19);
emit_int8((unsigned char)(0xC0 | encode));
@@ -6642,9 +6665,8 @@
assert(VM_Version::supports_avx(), "");
assert(src != xnoreg, "sanity");
assert(imm8 <= 0x01, "imm8: %u", imm8);
- int vector_len = VM_Version::supports_avx512novl() ? AVX_512bit : AVX_256bit;
- InstructionMark im(this);
- InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ false);
+ InstructionMark im(this);
+ InstructionAttr attributes(AVX_256bit, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);
attributes.set_address_attributes(/* tuple_type */ EVEX_T4, /* input_size_in_bits */ EVEX_32bit);
attributes.reset_is_clear_context();
vex_prefix(dst, 0, src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);
@@ -6656,10 +6678,10 @@
}
void Assembler::vextractf32x4(XMMRegister dst, XMMRegister src, uint8_t imm8) {
- assert(VM_Version::supports_avx(), "");
+ assert(VM_Version::supports_evex(), "");
assert(imm8 <= 0x03, "imm8: %u", imm8);
- int vector_len = VM_Version::supports_evex() ? AVX_512bit : AVX_256bit;
- InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ false);
+ InstructionAttr attributes(AVX_512bit, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);
+ attributes.set_is_evex_instruction();
int encode = vex_prefix_and_encode(src->encoding(), 0, dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);
emit_int8(0x19);
emit_int8((unsigned char)(0xC0 | encode));
@@ -6675,9 +6697,10 @@
assert(src != xnoreg, "sanity");
assert(imm8 <= 0x03, "imm8: %u", imm8);
InstructionMark im(this);
- InstructionAttr attributes(AVX_512bit, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ false);
+ InstructionAttr attributes(AVX_512bit, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);
attributes.set_address_attributes(/* tuple_type */ EVEX_T4, /* input_size_in_bits */ EVEX_32bit);
attributes.reset_is_clear_context();
+ attributes.set_is_evex_instruction();
vex_prefix(dst, 0, src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);
emit_int8(0x19);
emit_operand(src, dst);
@@ -6691,7 +6714,8 @@
void Assembler::vextractf64x2(XMMRegister dst, XMMRegister src, uint8_t imm8) {
assert(VM_Version::supports_avx512dq(), "");
assert(imm8 <= 0x03, "imm8: %u", imm8);
- InstructionAttr attributes(AVX_512bit, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ false);
+ InstructionAttr attributes(AVX_512bit, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);
+ attributes.set_is_evex_instruction();
int encode = vex_prefix_and_encode(src->encoding(), 0, dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);
emit_int8(0x19);
emit_int8((unsigned char)(0xC0 | encode));
@@ -6705,7 +6729,8 @@
void Assembler::vextractf64x4(XMMRegister dst, XMMRegister src, uint8_t imm8) {
assert(VM_Version::supports_evex(), "");
assert(imm8 <= 0x01, "imm8: %u", imm8);
- InstructionAttr attributes(AVX_512bit, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ false);
+ InstructionAttr attributes(AVX_512bit, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);
+ attributes.set_is_evex_instruction();
int encode = vex_prefix_and_encode(src->encoding(), 0, dst->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);
emit_int8(0x1B);
emit_int8((unsigned char)(0xC0 | encode));
@@ -6719,9 +6744,10 @@
assert(src != xnoreg, "sanity");
assert(imm8 <= 0x01, "imm8: %u", imm8);
InstructionMark im(this);
- InstructionAttr attributes(AVX_512bit, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ false);
+ InstructionAttr attributes(AVX_512bit, /* vex_w */ true, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);
attributes.set_address_attributes(/* tuple_type */ EVEX_T4,/* input_size_in_bits */ EVEX_64bit);
attributes.reset_is_clear_context();
+ attributes.set_is_evex_instruction();
vex_prefix(dst, 0, src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);
emit_int8(0x1B);
emit_operand(src, dst);
@@ -6730,38 +6756,17 @@
emit_int8(imm8 & 0x01);
}
-
-// legacy word/dword replicate
-void Assembler::vpbroadcastw(XMMRegister dst, XMMRegister src) {
- assert(VM_Version::supports_avx2(), "");
- InstructionAttr attributes(AVX_256bit, /* vex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);
- int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);
- emit_int8(0x79);
- emit_int8((unsigned char)(0xC0 | encode));
-}
-
-void Assembler::vpbroadcastd(XMMRegister dst, XMMRegister src) {
+// duplicate 1-byte integer data from src into programmed locations in dest : requires AVX512BW and AVX512VL
+void Assembler::vpbroadcastb(XMMRegister dst, XMMRegister src, int vector_len) {
assert(VM_Version::supports_avx2(), "");
- InstructionAttr attributes(AVX_256bit, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);
- int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);
- emit_int8(0x58);
- emit_int8((unsigned char)(0xC0 | encode));
-}
-
-
-// xmm/mem sourced byte/word/dword/qword replicate
-
-// duplicate 1-byte integer data from src into programmed locations in dest : requires AVX512BW and AVX512VL
-void Assembler::evpbroadcastb(XMMRegister dst, XMMRegister src, int vector_len) {
- assert(VM_Version::supports_evex(), "");
InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);
int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);
emit_int8(0x78);
emit_int8((unsigned char)(0xC0 | encode));
}
-void Assembler::evpbroadcastb(XMMRegister dst, Address src, int vector_len) {
- assert(VM_Version::supports_evex(), "");
+void Assembler::vpbroadcastb(XMMRegister dst, Address src, int vector_len) {
+ assert(VM_Version::supports_avx2(), "");
assert(dst != xnoreg, "sanity");
InstructionMark im(this);
InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);
@@ -6773,16 +6778,16 @@
}
// duplicate 2-byte integer data from src into programmed locations in dest : requires AVX512BW and AVX512VL
-void Assembler::evpbroadcastw(XMMRegister dst, XMMRegister src, int vector_len) {
- assert(VM_Version::supports_evex(), "");
+void Assembler::vpbroadcastw(XMMRegister dst, XMMRegister src, int vector_len) {
+ assert(VM_Version::supports_avx2(), "");
InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);
int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);
emit_int8(0x79);
emit_int8((unsigned char)(0xC0 | encode));
}
-void Assembler::evpbroadcastw(XMMRegister dst, Address src, int vector_len) {
- assert(VM_Version::supports_evex(), "");
+void Assembler::vpbroadcastw(XMMRegister dst, Address src, int vector_len) {
+ assert(VM_Version::supports_avx2(), "");
assert(dst != xnoreg, "sanity");
InstructionMark im(this);
InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);
@@ -6793,17 +6798,19 @@
emit_operand(dst, src);
}
+// xmm/mem sourced byte/word/dword/qword replicate
+
// duplicate 4-byte integer data from src into programmed locations in dest : requires AVX512VL
-void Assembler::evpbroadcastd(XMMRegister dst, XMMRegister src, int vector_len) {
- assert(VM_Version::supports_evex(), "");
+void Assembler::vpbroadcastd(XMMRegister dst, XMMRegister src, int vector_len) {
+ assert(UseAVX >= 2, "");
InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);
int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);
emit_int8(0x58);
emit_int8((unsigned char)(0xC0 | encode));
}
-void Assembler::evpbroadcastd(XMMRegister dst, Address src, int vector_len) {
- assert(VM_Version::supports_evex(), "");
+void Assembler::vpbroadcastd(XMMRegister dst, Address src, int vector_len) {
+ assert(VM_Version::supports_avx2(), "");
assert(dst != xnoreg, "sanity");
InstructionMark im(this);
InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);
@@ -6815,8 +6822,8 @@
}
// duplicate 8-byte integer data from src into programmed locations in dest : requires AVX512VL
-void Assembler::evpbroadcastq(XMMRegister dst, XMMRegister src, int vector_len) {
- assert(VM_Version::supports_evex(), "");
+void Assembler::vpbroadcastq(XMMRegister dst, XMMRegister src, int vector_len) {
+ assert(VM_Version::supports_avx2(), "");
InstructionAttr attributes(vector_len, /* vex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);
attributes.set_rex_vex_w_reverted();
int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);
@@ -6824,8 +6831,8 @@
emit_int8((unsigned char)(0xC0 | encode));
}
-void Assembler::evpbroadcastq(XMMRegister dst, Address src, int vector_len) {
- assert(VM_Version::supports_evex(), "");
+void Assembler::vpbroadcastq(XMMRegister dst, Address src, int vector_len) {
+ assert(VM_Version::supports_avx2(), "");
assert(dst != xnoreg, "sanity");
InstructionMark im(this);
InstructionAttr attributes(vector_len, /* vex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);
@@ -6863,16 +6870,16 @@
// scalar single/double precision replicate
// duplicate single precision data from src into programmed locations in dest : requires AVX512VL
-void Assembler::evpbroadcastss(XMMRegister dst, XMMRegister src, int vector_len) {
- assert(VM_Version::supports_evex(), "");
+void Assembler::vpbroadcastss(XMMRegister dst, XMMRegister src, int vector_len) {
+ assert(VM_Version::supports_avx(), "");
InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);
int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);
emit_int8(0x18);
emit_int8((unsigned char)(0xC0 | encode));
}
-void Assembler::evpbroadcastss(XMMRegister dst, Address src, int vector_len) {
- assert(VM_Version::supports_evex(), "");
+void Assembler::vpbroadcastss(XMMRegister dst, Address src, int vector_len) {
+ assert(VM_Version::supports_avx(), "");
assert(dst != xnoreg, "sanity");
InstructionMark im(this);
InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);
@@ -6884,8 +6891,8 @@
}
// duplicate double precision data from src into programmed locations in dest : requires AVX512VL
-void Assembler::evpbroadcastsd(XMMRegister dst, XMMRegister src, int vector_len) {
- assert(VM_Version::supports_evex(), "");
+void Assembler::vpbroadcastsd(XMMRegister dst, XMMRegister src, int vector_len) {
+ assert(VM_Version::supports_avx(), "");
InstructionAttr attributes(vector_len, /* vex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);
attributes.set_rex_vex_w_reverted();
int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);
@@ -6893,8 +6900,8 @@
emit_int8((unsigned char)(0xC0 | encode));
}
-void Assembler::evpbroadcastsd(XMMRegister dst, Address src, int vector_len) {
- assert(VM_Version::supports_evex(), "");
+void Assembler::vpbroadcastsd(XMMRegister dst, Address src, int vector_len) {
+ assert(VM_Version::supports_avx(), "");
assert(dst != xnoreg, "sanity");
InstructionMark im(this);
InstructionAttr attributes(vector_len, /* vex_w */ VM_Version::supports_evex(), /* legacy_mode */ false, /* no_mask_reg */ false, /* uses_vl */ true);
@@ -6911,7 +6918,7 @@
// duplicate 1-byte integer data from src into programmed locations in dest : requires AVX512BW and AVX512VL
void Assembler::evpbroadcastb(XMMRegister dst, Register src, int vector_len) {
- assert(VM_Version::supports_evex(), "");
+ assert(VM_Version::supports_avx512bw(), "");
InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);
attributes.set_is_evex_instruction();
int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);
@@ -6921,7 +6928,7 @@
// duplicate 2-byte integer data from src into programmed locations in dest : requires AVX512BW and AVX512VL
void Assembler::evpbroadcastw(XMMRegister dst, Register src, int vector_len) {
- assert(VM_Version::supports_evex(), "");
+ assert(VM_Version::supports_avx512bw(), "");
InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ _legacy_mode_bw, /* no_mask_reg */ true, /* uses_vl */ true);
attributes.set_is_evex_instruction();
int encode = vex_prefix_and_encode(dst->encoding(), 0, src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);
@@ -6967,7 +6974,7 @@
// Carry-Less Multiplication Quadword
void Assembler::pclmulqdq(XMMRegister dst, XMMRegister src, int mask) {
assert(VM_Version::supports_clmul(), "");
- InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ false, /* uses_vl */ false);
+ InstructionAttr attributes(AVX_128bit, /* rex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ false, /* uses_vl */ true);
int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);
emit_int8(0x44);
emit_int8((unsigned char)(0xC0 | encode));
@@ -6977,7 +6984,7 @@
// Carry-Less Multiplication Quadword
void Assembler::vpclmulqdq(XMMRegister dst, XMMRegister nds, XMMRegister src, int mask) {
assert(VM_Version::supports_avx() && VM_Version::supports_clmul(), "");
- InstructionAttr attributes(AVX_128bit, /* vex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ false, /* uses_vl */ false);
+ InstructionAttr attributes(AVX_128bit, /* vex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ false, /* uses_vl */ true);
int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);
emit_int8(0x44);
emit_int8((unsigned char)(0xC0 | encode));
@@ -7597,33 +7604,23 @@
set_attributes(attributes);
attributes->set_current_assembler(this);
- // if vector length is turned off, revert to AVX for vectors smaller than 512-bit
- if (UseAVX > 2 && _legacy_mode_vl && attributes->uses_vl()) {
- switch (attributes->get_vector_len()) {
- case AVX_128bit:
- case AVX_256bit:
- attributes->set_is_legacy_mode();
- break;
+ // For EVEX instruction (which is not marked as pure EVEX instruction) check and see if this instruction
+ // is allowed in legacy mode and has resources which will fit in it.
+ // Pure EVEX instructions will have is_evex_instruction set in their definition.
+ if (!attributes->is_legacy_mode()) {
+ if (UseAVX > 2 && !attributes->is_evex_instruction() && !_is_managed) {
+ if ((attributes->get_vector_len() != AVX_512bit) && (nds_enc < 16) && (xreg_enc < 16)) {
+ attributes->set_is_legacy_mode();
+ }
}
}
- // For pure EVEX check and see if this instruction
- // is allowed in legacy mode and has resources which will
- // fit in it. Pure EVEX instructions will use set_is_evex_instruction in their definition,
- // else that field is set when we encode to EVEX
- if (UseAVX > 2 && !attributes->is_legacy_mode() &&
- !_is_managed && !attributes->is_evex_instruction()) {
- if (!_legacy_mode_vl && attributes->get_vector_len() != AVX_512bit) {
- bool check_register_bank = NOT_IA32(true) IA32_ONLY(false);
- if (check_register_bank) {
- // check nds_enc and xreg_enc for upper bank usage
- if (nds_enc < 16 && xreg_enc < 16) {
- attributes->set_is_legacy_mode();
- }
- } else {
- attributes->set_is_legacy_mode();
- }
- }
+ if (UseAVX > 2) {
+ assert(((!attributes->uses_vl()) ||
+ (attributes->get_vector_len() == AVX_512bit) ||
+ (!_legacy_mode_vl) ||
+ (attributes->is_legacy_mode())),"XMM register should be 0-15");
+ assert(((nds_enc < 16 && xreg_enc < 16) || (!attributes->is_legacy_mode())),"XMM register should be 0-15");
}
_is_managed = false;
@@ -7653,43 +7650,31 @@
bool vex_x = false;
set_attributes(attributes);
attributes->set_current_assembler(this);
- bool check_register_bank = NOT_IA32(true) IA32_ONLY(false);
-
- // if vector length is turned off, revert to AVX for vectors smaller than 512-bit
- if (UseAVX > 2 && _legacy_mode_vl && attributes->uses_vl()) {
- switch (attributes->get_vector_len()) {
- case AVX_128bit:
- case AVX_256bit:
- if (check_register_bank) {
- if (dst_enc >= 16 || nds_enc >= 16 || src_enc >= 16) {
- // up propagate arithmetic instructions to meet RA requirements
- attributes->set_vector_len(AVX_512bit);
- } else {
+
+ // For EVEX instruction (which is not marked as pure EVEX instruction) check and see if this instruction
+ // is allowed in legacy mode and has resources which will fit in it.
+ // Pure EVEX instructions will have is_evex_instruction set in their definition.
+ if (!attributes->is_legacy_mode()) {
+ if (UseAVX > 2 && !attributes->is_evex_instruction() && !_is_managed) {
+ if ((!attributes->uses_vl() || (attributes->get_vector_len() != AVX_512bit)) &&
+ (dst_enc < 16) && (nds_enc < 16) && (src_enc < 16)) {
attributes->set_is_legacy_mode();
- }
- } else {
- attributes->set_is_legacy_mode();
}
- break;
}
}
- // For pure EVEX check and see if this instruction
- // is allowed in legacy mode and has resources which will
- // fit in it. Pure EVEX instructions will use set_is_evex_instruction in their definition,
- // else that field is set when we encode to EVEX
- if (UseAVX > 2 && !attributes->is_legacy_mode() &&
- !_is_managed && !attributes->is_evex_instruction()) {
- if (!_legacy_mode_vl && attributes->get_vector_len() != AVX_512bit) {
- if (check_register_bank) {
- // check dst_enc, nds_enc and src_enc for upper bank usage
- if (dst_enc < 16 && nds_enc < 16 && src_enc < 16) {
- attributes->set_is_legacy_mode();
- }
- } else {
- attributes->set_is_legacy_mode();
- }
- }
+ if (UseAVX > 2) {
+ // All the scalar fp instructions (with uses_vl as false) can have legacy_mode as false
+ // Instruction with uses_vl true are vector instructions
+ // All the vector instructions with AVX_512bit length can have legacy_mode as false
+ // All the vector instructions with < AVX_512bit length can have legacy_mode as false if AVX512vl() is supported
+ // Rest all should have legacy_mode set as true
+ assert(((!attributes->uses_vl()) ||
+ (attributes->get_vector_len() == AVX_512bit) ||
+ (!_legacy_mode_vl) ||
+ (attributes->is_legacy_mode())),"XMM register should be 0-15");
+ // Instruction with legacy_mode true should have dst, nds and src < 15
+ assert(((dst_enc < 16 && nds_enc < 16 && src_enc < 16) || (!attributes->is_legacy_mode())),"XMM register should be 0-15");
}
_is_managed = false;
@@ -7741,7 +7726,7 @@
void Assembler::cmppd(XMMRegister dst, XMMRegister nds, XMMRegister src, int cop, int vector_len) {
assert(VM_Version::supports_avx(), "");
assert(!VM_Version::supports_evex(), "");
- InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ false, /* uses_vl */ false);
+ InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ false, /* uses_vl */ true);
int encode = simd_prefix_and_encode(dst, nds, src, VEX_SIMD_66, VEX_OPCODE_0F, &attributes);
emit_int8((unsigned char)0xC2);
emit_int8((unsigned char)(0xC0 | encode));
@@ -7751,7 +7736,7 @@
void Assembler::blendvpd(XMMRegister dst, XMMRegister nds, XMMRegister src1, XMMRegister src2, int vector_len) {
assert(VM_Version::supports_avx(), "");
assert(!VM_Version::supports_evex(), "");
- InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ false, /* uses_vl */ false);
+ InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ false, /* uses_vl */ true);
int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src1->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);
emit_int8((unsigned char)0x4B);
emit_int8((unsigned char)(0xC0 | encode));
@@ -7762,7 +7747,7 @@
void Assembler::cmpps(XMMRegister dst, XMMRegister nds, XMMRegister src, int cop, int vector_len) {
assert(VM_Version::supports_avx(), "");
assert(!VM_Version::supports_evex(), "");
- InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ false, /* uses_vl */ false);
+ InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ false, /* uses_vl */ true);
int encode = simd_prefix_and_encode(dst, nds, src, VEX_SIMD_NONE, VEX_OPCODE_0F, &attributes);
emit_int8((unsigned char)0xC2);
emit_int8((unsigned char)(0xC0 | encode));
@@ -7772,7 +7757,7 @@
void Assembler::blendvps(XMMRegister dst, XMMRegister nds, XMMRegister src1, XMMRegister src2, int vector_len) {
assert(VM_Version::supports_avx(), "");
assert(!VM_Version::supports_evex(), "");
- InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ false, /* uses_vl */ false);
+ InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ false, /* uses_vl */ true);
int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src1->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);
emit_int8((unsigned char)0x4A);
emit_int8((unsigned char)(0xC0 | encode));
@@ -7782,7 +7767,7 @@
void Assembler::vpblendd(XMMRegister dst, XMMRegister nds, XMMRegister src, int imm8, int vector_len) {
assert(VM_Version::supports_avx2(), "");
- InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ false, /* uses_vl */ false);
+ InstructionAttr attributes(vector_len, /* vex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ false, /* uses_vl */ true);
int encode = vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_3A, &attributes);
emit_int8((unsigned char)0x02);
emit_int8((unsigned char)(0xC0 | encode));
@@ -7791,7 +7776,7 @@
void Assembler::shlxl(Register dst, Register src1, Register src2) {
assert(VM_Version::supports_bmi2(), "");
- InstructionAttr attributes(AVX_128bit, /* vex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);
+ InstructionAttr attributes(AVX_128bit, /* vex_w */ false, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ true);
int encode = vex_prefix_and_encode(dst->encoding(), src2->encoding(), src1->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);
emit_int8((unsigned char)0xF7);
emit_int8((unsigned char)(0xC0 | encode));
@@ -7799,7 +7784,7 @@
void Assembler::shlxq(Register dst, Register src1, Register src2) {
assert(VM_Version::supports_bmi2(), "");
- InstructionAttr attributes(AVX_128bit, /* vex_w */ true, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ false);
+ InstructionAttr attributes(AVX_128bit, /* vex_w */ true, /* legacy_mode */ true, /* no_mask_reg */ true, /* uses_vl */ true);
int encode = vex_prefix_and_encode(dst->encoding(), src2->encoding(), src1->encoding(), VEX_SIMD_66, VEX_OPCODE_0F_38, &attributes);
emit_int8((unsigned char)0xF7);
emit_int8((unsigned char)(0xC0 | encode));
--- a/src/hotspot/cpu/x86/assembler_x86.hpp Wed Sep 26 18:36:55 2018 +0100
+++ b/src/hotspot/cpu/x86/assembler_x86.hpp Thu Sep 27 10:49:10 2018 -0700
@@ -2097,6 +2097,7 @@
// Andn packed integers
void pandn(XMMRegister dst, XMMRegister src);
+ void vpandn(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len);
// Or packed integers
void por(XMMRegister dst, XMMRegister src);
@@ -2134,6 +2135,7 @@
void vextracti32x4(Address dst, XMMRegister src, uint8_t imm8);
void vextracti64x2(XMMRegister dst, XMMRegister src, uint8_t imm8);
void vextracti64x4(XMMRegister dst, XMMRegister src, uint8_t imm8);
+ void vextracti64x4(Address dst, XMMRegister src, uint8_t imm8);
// vextractf forms
void vextractf128(XMMRegister dst, XMMRegister src, uint8_t imm8);
@@ -2144,28 +2146,24 @@
void vextractf64x4(XMMRegister dst, XMMRegister src, uint8_t imm8);
void vextractf64x4(Address dst, XMMRegister src, uint8_t imm8);
- // legacy xmm sourced word/dword replicate
- void vpbroadcastw(XMMRegister dst, XMMRegister src);
- void vpbroadcastd(XMMRegister dst, XMMRegister src);
-
// xmm/mem sourced byte/word/dword/qword replicate
- void evpbroadcastb(XMMRegister dst, XMMRegister src, int vector_len);
- void evpbroadcastb(XMMRegister dst, Address src, int vector_len);
- void evpbroadcastw(XMMRegister dst, XMMRegister src, int vector_len);
- void evpbroadcastw(XMMRegister dst, Address src, int vector_len);
- void evpbroadcastd(XMMRegister dst, XMMRegister src, int vector_len);
- void evpbroadcastd(XMMRegister dst, Address src, int vector_len);
- void evpbroadcastq(XMMRegister dst, XMMRegister src, int vector_len);
- void evpbroadcastq(XMMRegister dst, Address src, int vector_len);
+ void vpbroadcastb(XMMRegister dst, XMMRegister src, int vector_len);
+ void vpbroadcastb(XMMRegister dst, Address src, int vector_len);
+ void vpbroadcastw(XMMRegister dst, XMMRegister src, int vector_len);
+ void vpbroadcastw(XMMRegister dst, Address src, int vector_len);
+ void vpbroadcastd(XMMRegister dst, XMMRegister src, int vector_len);
+ void vpbroadcastd(XMMRegister dst, Address src, int vector_len);
+ void vpbroadcastq(XMMRegister dst, XMMRegister src, int vector_len);
+ void vpbroadcastq(XMMRegister dst, Address src, int vector_len);
void evbroadcasti64x2(XMMRegister dst, XMMRegister src, int vector_len);
void evbroadcasti64x2(XMMRegister dst, Address src, int vector_len);
// scalar single/double precision replicate
- void evpbroadcastss(XMMRegister dst, XMMRegister src, int vector_len);
- void evpbroadcastss(XMMRegister dst, Address src, int vector_len);
- void evpbroadcastsd(XMMRegister dst, XMMRegister src, int vector_len);
- void evpbroadcastsd(XMMRegister dst, Address src, int vector_len);
+ void vpbroadcastss(XMMRegister dst, XMMRegister src, int vector_len);
+ void vpbroadcastss(XMMRegister dst, Address src, int vector_len);
+ void vpbroadcastsd(XMMRegister dst, XMMRegister src, int vector_len);
+ void vpbroadcastsd(XMMRegister dst, Address src, int vector_len);
// gpr sourced byte/word/dword/qword replicate
void evpbroadcastb(XMMRegister dst, Register src, int vector_len);
--- a/src/hotspot/cpu/x86/c1_LIRAssembler_x86.cpp Wed Sep 26 18:36:55 2018 +0100
+++ b/src/hotspot/cpu/x86/c1_LIRAssembler_x86.cpp Thu Sep 27 10:49:10 2018 -0700
@@ -68,7 +68,6 @@
static jlong *double_signflip_pool = double_quadword(&fp_signmask_pool[4*2], (jlong)UCONST64(0x8000000000000000), (jlong)UCONST64(0x8000000000000000));
-
NEEDS_CLEANUP // remove this definitions ?
const Register IC_Klass = rax; // where the IC klass is cached
const Register SYNC_header = rax; // synchronization header
@@ -650,7 +649,7 @@
case T_FLOAT: {
if (dest->is_single_xmm()) {
- if (c->is_zero_float()) {
+ if (LP64_ONLY(UseAVX < 2 &&) c->is_zero_float()) {
__ xorps(dest->as_xmm_float_reg(), dest->as_xmm_float_reg());
} else {
__ movflt(dest->as_xmm_float_reg(),
@@ -672,7 +671,7 @@
case T_DOUBLE: {
if (dest->is_double_xmm()) {
- if (c->is_zero_double()) {
+ if (LP64_ONLY(UseAVX < 2 &&) c->is_zero_double()) {
__ xorpd(dest->as_xmm_double_reg(), dest->as_xmm_double_reg());
} else {
__ movdbl(dest->as_xmm_double_reg(),
@@ -2395,16 +2394,24 @@
}
-void LIR_Assembler::intrinsic_op(LIR_Code code, LIR_Opr value, LIR_Opr unused, LIR_Opr dest, LIR_Op* op) {
+void LIR_Assembler::intrinsic_op(LIR_Code code, LIR_Opr value, LIR_Opr tmp, LIR_Opr dest, LIR_Op* op) {
if (value->is_double_xmm()) {
switch(code) {
case lir_abs :
{
- if (dest->as_xmm_double_reg() != value->as_xmm_double_reg()) {
- __ movdbl(dest->as_xmm_double_reg(), value->as_xmm_double_reg());
+#ifdef _LP64
+ if (UseAVX > 2 && !VM_Version::supports_avx512vl()) {
+ assert(tmp->is_valid(), "need temporary");
+ __ vpandn(dest->as_xmm_double_reg(), tmp->as_xmm_double_reg(), value->as_xmm_double_reg(), 2);
+ } else {
+#endif
+ if (dest->as_xmm_double_reg() != value->as_xmm_double_reg()) {
+ __ movdbl(dest->as_xmm_double_reg(), value->as_xmm_double_reg());
+ }
+ assert(!tmp->is_valid(), "do not need temporary");
+ __ andpd(dest->as_xmm_double_reg(),
+ ExternalAddress((address)double_signmask_pool));
}
- __ andpd(dest->as_xmm_double_reg(),
- ExternalAddress((address)double_signmask_pool));
}
break;
@@ -3734,7 +3741,7 @@
}
-void LIR_Assembler::negate(LIR_Opr left, LIR_Opr dest) {
+void LIR_Assembler::negate(LIR_Opr left, LIR_Opr dest, LIR_Opr tmp) {
if (left->is_single_cpu()) {
__ negl(left->as_register());
move_regs(left->as_register(), dest->as_register());
@@ -3759,24 +3766,36 @@
#endif // _LP64
} else if (dest->is_single_xmm()) {
- if (left->as_xmm_float_reg() != dest->as_xmm_float_reg()) {
- __ movflt(dest->as_xmm_float_reg(), left->as_xmm_float_reg());
+#ifdef _LP64
+ if (UseAVX > 2 && !VM_Version::supports_avx512vl()) {
+ assert(tmp->is_valid(), "need temporary");
+ assert_different_registers(left->as_xmm_float_reg(), tmp->as_xmm_float_reg());
+ __ vpxor(dest->as_xmm_float_reg(), tmp->as_xmm_float_reg(), left->as_xmm_float_reg(), 2);
}
- if (UseAVX > 0) {
- __ vnegatess(dest->as_xmm_float_reg(), dest->as_xmm_float_reg(),
- ExternalAddress((address)float_signflip_pool));
- } else {
+ else
+#endif
+ {
+ assert(!tmp->is_valid(), "do not need temporary");
+ 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));
}
} 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());
+#ifdef _LP64
+ if (UseAVX > 2 && !VM_Version::supports_avx512vl()) {
+ assert(tmp->is_valid(), "need temporary");
+ assert_different_registers(left->as_xmm_double_reg(), tmp->as_xmm_double_reg());
+ __ vpxor(dest->as_xmm_double_reg(), tmp->as_xmm_double_reg(), left->as_xmm_double_reg(), 2);
}
- if (UseAVX > 0) {
- __ vnegatesd(dest->as_xmm_double_reg(), dest->as_xmm_double_reg(),
- ExternalAddress((address)double_signflip_pool));
- } else {
+ else
+#endif
+ {
+ assert(!tmp->is_valid(), "do not need temporary");
+ 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));
}
--- a/src/hotspot/cpu/x86/c1_LIRGenerator_x86.cpp Wed Sep 26 18:36:55 2018 +0100
+++ b/src/hotspot/cpu/x86/c1_LIRGenerator_x86.cpp Thu Sep 27 10:49:10 2018 -0700
@@ -320,7 +320,21 @@
value.set_destroys_register();
value.load_item();
LIR_Opr reg = rlock(x);
- __ negate(value.result(), reg);
+
+ LIR_Opr tmp = LIR_OprFact::illegalOpr;
+#ifdef _LP64
+ if (UseAVX > 2 && !VM_Version::supports_avx512vl()) {
+ if (x->type()->tag() == doubleTag) {
+ tmp = new_register(T_DOUBLE);
+ __ move(LIR_OprFact::doubleConst(-0.0), tmp);
+ }
+ else if (x->type()->tag() == floatTag) {
+ tmp = new_register(T_FLOAT);
+ __ move(LIR_OprFact::floatConst(-0.0), tmp);
+ }
+ }
+#endif
+ __ negate(value.result(), reg, tmp);
set_result(x, round_item(reg));
}
@@ -748,8 +762,17 @@
LIR_Opr calc_input = value.result();
LIR_Opr calc_result = rlock_result(x);
+ LIR_Opr tmp = LIR_OprFact::illegalOpr;
+#ifdef _LP64
+ if (UseAVX > 2 && (!VM_Version::supports_avx512vl()) &&
+ (x->id() == vmIntrinsics::_dabs)) {
+ tmp = new_register(T_DOUBLE);
+ __ move(LIR_OprFact::doubleConst(-0.0), tmp);
+ }
+#endif
+
switch(x->id()) {
- case vmIntrinsics::_dabs: __ abs (calc_input, calc_result, LIR_OprFact::illegalOpr); break;
+ case vmIntrinsics::_dabs: __ abs (calc_input, calc_result, tmp); break;
case vmIntrinsics::_dsqrt: __ sqrt (calc_input, calc_result, LIR_OprFact::illegalOpr); break;
default: ShouldNotReachHere();
}
--- a/src/hotspot/cpu/x86/globals_x86.hpp Wed Sep 26 18:36:55 2018 +0100
+++ b/src/hotspot/cpu/x86/globals_x86.hpp Thu Sep 27 10:49:10 2018 -0700
@@ -119,7 +119,7 @@
product(bool, UseStoreImmI16, true, \
"Use store immediate 16-bits value instruction on x86") \
\
- product(intx, UseAVX, 2, \
+ product(intx, UseAVX, 3, \
"Highest supported AVX instructions set on x86/x64") \
range(0, 99) \
\
--- a/src/hotspot/cpu/x86/macroAssembler_x86.cpp Wed Sep 26 18:36:55 2018 +0100
+++ b/src/hotspot/cpu/x86/macroAssembler_x86.cpp Thu Sep 27 10:49:10 2018 -0700
@@ -2942,16 +2942,6 @@
}
}
-void MacroAssembler::push_zmm(XMMRegister reg) {
- lea(rsp, Address(rsp, -64)); // Use lea to not affect flags
- evmovdqul(Address(rsp, 0), reg, Assembler::AVX_512bit);
-}
-
-void MacroAssembler::pop_zmm(XMMRegister reg) {
- evmovdqul(reg, Address(rsp, 0), Assembler::AVX_512bit);
- lea(rsp, Address(rsp, 64)); // Use lea to not affect flags
-}
-
void MacroAssembler::fremr(Register tmp) {
save_rax(tmp);
{ Label L;
@@ -3332,27 +3322,18 @@
}
void MacroAssembler::movdqu(Address dst, XMMRegister src) {
- if (UseAVX > 2 && !VM_Version::supports_avx512vl() && (src->encoding() > 15)) {
- Assembler::vextractf32x4(dst, src, 0);
- } else {
+ assert(((src->encoding() < 16) || VM_Version::supports_avx512vl()),"XMM register should be 0-15");
Assembler::movdqu(dst, src);
- }
}
void MacroAssembler::movdqu(XMMRegister dst, Address src) {
- if (UseAVX > 2 && !VM_Version::supports_avx512vl() && (dst->encoding() > 15)) {
- Assembler::vinsertf32x4(dst, dst, src, 0);
- } else {
+ assert(((dst->encoding() < 16) || VM_Version::supports_avx512vl()),"XMM register should be 0-15");
Assembler::movdqu(dst, src);
- }
}
void MacroAssembler::movdqu(XMMRegister dst, XMMRegister src) {
- if (UseAVX > 2 && !VM_Version::supports_avx512vl()) {
- Assembler::evmovdqul(dst, src, Assembler::AVX_512bit);
- } else {
+ assert(((dst->encoding() < 16 && src->encoding() < 16) || VM_Version::supports_avx512vl()),"XMM register should be 0-15");
Assembler::movdqu(dst, src);
- }
}
void MacroAssembler::movdqu(XMMRegister dst, AddressLiteral src, Register scratchReg) {
@@ -3365,28 +3346,18 @@
}
void MacroAssembler::vmovdqu(Address dst, XMMRegister src) {
- if (UseAVX > 2 && !VM_Version::supports_avx512vl() && (src->encoding() > 15)) {
- vextractf64x4_low(dst, src);
- } else {
+ assert(((src->encoding() < 16) || VM_Version::supports_avx512vl()),"XMM register should be 0-15");
Assembler::vmovdqu(dst, src);
- }
}
void MacroAssembler::vmovdqu(XMMRegister dst, Address src) {
- if (UseAVX > 2 && !VM_Version::supports_avx512vl() && (dst->encoding() > 15)) {
- vinsertf64x4_low(dst, src);
- } else {
+ assert(((dst->encoding() < 16) || VM_Version::supports_avx512vl()),"XMM register should be 0-15");
Assembler::vmovdqu(dst, src);
- }
}
void MacroAssembler::vmovdqu(XMMRegister dst, XMMRegister src) {
- if (UseAVX > 2 && !VM_Version::supports_avx512vl()) {
- Assembler::evmovdqul(dst, src, Assembler::AVX_512bit);
- }
- else {
+ assert(((dst->encoding() < 16 && src->encoding() < 16) || VM_Version::supports_avx512vl()),"XMM register should be 0-15");
Assembler::vmovdqu(dst, src);
- }
}
void MacroAssembler::vmovdqu(XMMRegister dst, AddressLiteral src) {
@@ -3670,187 +3641,43 @@
}
void MacroAssembler::pcmpeqb(XMMRegister dst, XMMRegister src) {
- int dst_enc = dst->encoding();
- int src_enc = src->encoding();
- if (VM_Version::supports_avxonly() || VM_Version::supports_avx512bw()) {
- Assembler::pcmpeqb(dst, src);
- } else if ((dst_enc < 16) && (src_enc < 16)) {
- Assembler::pcmpeqb(dst, src);
- } else if (src_enc < 16) {
- push_zmm(xmm0);
- evmovdqul(xmm0, dst, Assembler::AVX_512bit);
- Assembler::pcmpeqb(xmm0, src);
- movdqu(dst, xmm0);
- pop_zmm(xmm0);
- } else if (dst_enc < 16) {
- push_zmm(xmm0);
- evmovdqul(xmm0, src, Assembler::AVX_512bit);
- Assembler::pcmpeqb(dst, xmm0);
- pop_zmm(xmm0);
- } else {
- push_zmm(xmm0);
- push_zmm(xmm1);
- movdqu(xmm0, src);
- movdqu(xmm1, dst);
- Assembler::pcmpeqb(xmm1, xmm0);
- movdqu(dst, xmm1);
- pop_zmm(xmm1);
- pop_zmm(xmm0);
- }
+ assert(((dst->encoding() < 16 && src->encoding() < 16) || VM_Version::supports_avx512vlbw()),"XMM register should be 0-15");
+ Assembler::pcmpeqb(dst, src);
}
void MacroAssembler::pcmpeqw(XMMRegister dst, XMMRegister src) {
- int dst_enc = dst->encoding();
- int src_enc = src->encoding();
- if (VM_Version::supports_avxonly() || VM_Version::supports_avx512bw()) {
- Assembler::pcmpeqw(dst, src);
- } else if ((dst_enc < 16) && (src_enc < 16)) {
- Assembler::pcmpeqw(dst, src);
- } else if (src_enc < 16) {
- push_zmm(xmm0);
- evmovdqul(xmm0, dst, Assembler::AVX_512bit);
- Assembler::pcmpeqw(xmm0, src);
- movdqu(dst, xmm0);
- pop_zmm(xmm0);
- } else if (dst_enc < 16) {
- push_zmm(xmm0);
- evmovdqul(xmm0, src, Assembler::AVX_512bit);
- Assembler::pcmpeqw(dst, xmm0);
- pop_zmm(xmm0);
- } else {
- push_zmm(xmm0);
- push_zmm(xmm1);
- movdqu(xmm0, src);
- movdqu(xmm1, dst);
- Assembler::pcmpeqw(xmm1, xmm0);
- movdqu(dst, xmm1);
- pop_zmm(xmm1);
- pop_zmm(xmm0);
- }
+ assert(((dst->encoding() < 16 && src->encoding() < 16) || VM_Version::supports_avx512vlbw()),"XMM register should be 0-15");
+ Assembler::pcmpeqw(dst, src);
}
void MacroAssembler::pcmpestri(XMMRegister dst, Address src, int imm8) {
- int dst_enc = dst->encoding();
- if (dst_enc < 16) {
- Assembler::pcmpestri(dst, src, imm8);
- } else {
- push_zmm(xmm0);
- evmovdqul(xmm0, dst, Assembler::AVX_512bit);
- Assembler::pcmpestri(xmm0, src, imm8);
- movdqu(dst, xmm0);
- pop_zmm(xmm0);
- }
+ assert((dst->encoding() < 16),"XMM register should be 0-15");
+ Assembler::pcmpestri(dst, src, imm8);
}
void MacroAssembler::pcmpestri(XMMRegister dst, XMMRegister src, int imm8) {
- int dst_enc = dst->encoding();
- int src_enc = src->encoding();
- if ((dst_enc < 16) && (src_enc < 16)) {
- Assembler::pcmpestri(dst, src, imm8);
- } else if (src_enc < 16) {
- push_zmm(xmm0);
- evmovdqul(xmm0, dst, Assembler::AVX_512bit);
- Assembler::pcmpestri(xmm0, src, imm8);
- movdqu(dst, xmm0);
- pop_zmm(xmm0);
- } else if (dst_enc < 16) {
- push_zmm(xmm0);
- evmovdqul(xmm0, src, Assembler::AVX_512bit);
- Assembler::pcmpestri(dst, xmm0, imm8);
- pop_zmm(xmm0);
- } else {
- push_zmm(xmm0);
- push_zmm(xmm1);
- movdqu(xmm0, src);
- movdqu(xmm1, dst);
- Assembler::pcmpestri(xmm1, xmm0, imm8);
- movdqu(dst, xmm1);
- pop_zmm(xmm1);
- pop_zmm(xmm0);
- }
+ assert((dst->encoding() < 16 && src->encoding() < 16),"XMM register should be 0-15");
+ Assembler::pcmpestri(dst, src, imm8);
}
void MacroAssembler::pmovzxbw(XMMRegister dst, XMMRegister src) {
- int dst_enc = dst->encoding();
- int src_enc = src->encoding();
- if (VM_Version::supports_avxonly() || VM_Version::supports_avx512bw()) {
- Assembler::pmovzxbw(dst, src);
- } else if ((dst_enc < 16) && (src_enc < 16)) {
- Assembler::pmovzxbw(dst, src);
- } else if (src_enc < 16) {
- push_zmm(xmm0);
- evmovdqul(xmm0, dst, Assembler::AVX_512bit);
- Assembler::pmovzxbw(xmm0, src);
- movdqu(dst, xmm0);
- pop_zmm(xmm0);
- } else if (dst_enc < 16) {
- push_zmm(xmm0);
- evmovdqul(xmm0, src, Assembler::AVX_512bit);
- Assembler::pmovzxbw(dst, xmm0);
- pop_zmm(xmm0);
- } else {
- push_zmm(xmm0);
- push_zmm(xmm1);
- movdqu(xmm0, src);
- movdqu(xmm1, dst);
- Assembler::pmovzxbw(xmm1, xmm0);
- movdqu(dst, xmm1);
- pop_zmm(xmm1);
- pop_zmm(xmm0);
- }
+ assert(((dst->encoding() < 16 && src->encoding() < 16) || VM_Version::supports_avx512vlbw()),"XMM register should be 0-15");
+ Assembler::pmovzxbw(dst, src);
}
void MacroAssembler::pmovzxbw(XMMRegister dst, Address src) {
- int dst_enc = dst->encoding();
- if (VM_Version::supports_avxonly() || VM_Version::supports_avx512bw()) {
- Assembler::pmovzxbw(dst, src);
- } else if (dst_enc < 16) {
- Assembler::pmovzxbw(dst, src);
- } else {
- push_zmm(xmm0);
- evmovdqul(xmm0, dst, Assembler::AVX_512bit);
- Assembler::pmovzxbw(xmm0, src);
- movdqu(dst, xmm0);
- pop_zmm(xmm0);
- }
+ assert(((dst->encoding() < 16) || VM_Version::supports_avx512vlbw()),"XMM register should be 0-15");
+ Assembler::pmovzxbw(dst, src);
}
void MacroAssembler::pmovmskb(Register dst, XMMRegister src) {
- int src_enc = src->encoding();
- if (src_enc < 16) {
- Assembler::pmovmskb(dst, src);
- } else {
- push_zmm(xmm0);
- evmovdqul(xmm0, src, Assembler::AVX_512bit);
- Assembler::pmovmskb(dst, xmm0);
- pop_zmm(xmm0);
- }
+ assert((src->encoding() < 16),"XMM register should be 0-15");
+ Assembler::pmovmskb(dst, src);
}
void MacroAssembler::ptest(XMMRegister dst, XMMRegister src) {
- int dst_enc = dst->encoding();
- int src_enc = src->encoding();
- if ((dst_enc < 16) && (src_enc < 16)) {
- Assembler::ptest(dst, src);
- } else if (src_enc < 16) {
- push_zmm(xmm0);
- evmovdqul(xmm0, dst, Assembler::AVX_512bit);
- Assembler::ptest(xmm0, src);
- pop_zmm(xmm0);
- } else if (dst_enc < 16) {
- push_zmm(xmm0);
- evmovdqul(xmm0, src, Assembler::AVX_512bit);
- Assembler::ptest(dst, xmm0);
- pop_zmm(xmm0);
- } else {
- push_zmm(xmm0);
- push_zmm(xmm1);
- movdqu(xmm0, src);
- movdqu(xmm1, dst);
- Assembler::ptest(xmm1, xmm0);
- pop_zmm(xmm1);
- pop_zmm(xmm0);
- }
+ assert((dst->encoding() < 16 && src->encoding() < 16),"XMM register should be 0-15");
+ Assembler::ptest(dst, src);
}
void MacroAssembler::sqrtsd(XMMRegister dst, AddressLiteral src) {
@@ -3979,194 +3806,33 @@
}
void MacroAssembler::vabsss(XMMRegister dst, XMMRegister nds, XMMRegister src, AddressLiteral negate_field, int vector_len) {
- int dst_enc = dst->encoding();
- int nds_enc = nds->encoding();
- int src_enc = src->encoding();
- if ((dst_enc < 16) && (nds_enc < 16)) {
- vandps(dst, nds, negate_field, vector_len);
- } else if ((src_enc < 16) && (dst_enc < 16)) {
- // Use src scratch register
- evmovdqul(src, nds, Assembler::AVX_512bit);
- vandps(dst, src, negate_field, vector_len);
- } else if (dst_enc < 16) {
- evmovdqul(dst, nds, Assembler::AVX_512bit);
- vandps(dst, dst, negate_field, vector_len);
- } else if (nds_enc < 16) {
- vandps(nds, nds, negate_field, vector_len);
- evmovdqul(dst, nds, Assembler::AVX_512bit);
- } else if (src_enc < 16) {
- evmovdqul(src, nds, Assembler::AVX_512bit);
- vandps(src, src, negate_field, vector_len);
- evmovdqul(dst, src, Assembler::AVX_512bit);
- } else {
- if (src_enc != dst_enc) {
- // Use src scratch register
- evmovdqul(src, xmm0, Assembler::AVX_512bit);
- evmovdqul(xmm0, nds, Assembler::AVX_512bit);
- vandps(xmm0, xmm0, negate_field, vector_len);
- evmovdqul(dst, xmm0, Assembler::AVX_512bit);
- evmovdqul(xmm0, src, Assembler::AVX_512bit);
- } else {
- push_zmm(xmm0);
- evmovdqul(xmm0, nds, Assembler::AVX_512bit);
- vandps(xmm0, xmm0, negate_field, vector_len);
- evmovdqul(dst, xmm0, Assembler::AVX_512bit);
- pop_zmm(xmm0);
- }
- }
+ assert(((dst->encoding() < 16 && src->encoding() < 16 && nds->encoding() < 16) || VM_Version::supports_avx512vldq()),"XMM register should be 0-15");
+ vandps(dst, nds, negate_field, vector_len);
}
void MacroAssembler::vabssd(XMMRegister dst, XMMRegister nds, XMMRegister src, AddressLiteral negate_field, int vector_len) {
- int dst_enc = dst->encoding();
- int nds_enc = nds->encoding();
- int src_enc = src->encoding();
- if ((dst_enc < 16) && (nds_enc < 16)) {
- vandpd(dst, nds, negate_field, vector_len);
- } else if ((src_enc < 16) && (dst_enc < 16)) {
- // Use src scratch register
- evmovdqul(src, nds, Assembler::AVX_512bit);
- vandpd(dst, src, negate_field, vector_len);
- } else if (dst_enc < 16) {
- evmovdqul(dst, nds, Assembler::AVX_512bit);
- vandpd(dst, dst, negate_field, vector_len);
- } else if (nds_enc < 16) {
- vandpd(nds, nds, negate_field, vector_len);
- evmovdqul(dst, nds, Assembler::AVX_512bit);
- } else if (src_enc < 16) {
- evmovdqul(src, nds, Assembler::AVX_512bit);
- vandpd(src, src, negate_field, vector_len);
- evmovdqul(dst, src, Assembler::AVX_512bit);
- } else {
- if (src_enc != dst_enc) {
- evmovdqul(src, xmm0, Assembler::AVX_512bit);
- evmovdqul(xmm0, nds, Assembler::AVX_512bit);
- vandpd(xmm0, xmm0, negate_field, vector_len);
- evmovdqul(dst, xmm0, Assembler::AVX_512bit);
- evmovdqul(xmm0, src, Assembler::AVX_512bit);
- } else {
- push_zmm(xmm0);
- evmovdqul(xmm0, nds, Assembler::AVX_512bit);
- vandpd(xmm0, xmm0, negate_field, vector_len);
- evmovdqul(dst, xmm0, Assembler::AVX_512bit);
- pop_zmm(xmm0);
- }
- }
+ assert(((dst->encoding() < 16 && src->encoding() < 16 && nds->encoding() < 16) || VM_Version::supports_avx512vldq()),"XMM register should be 0-15");
+ vandpd(dst, nds, negate_field, vector_len);
}
void MacroAssembler::vpaddb(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {
- int dst_enc = dst->encoding();
- int nds_enc = nds->encoding();
- int src_enc = src->encoding();
- if (VM_Version::supports_avxonly() || VM_Version::supports_avx512bw()) {
- Assembler::vpaddb(dst, nds, src, vector_len);
- } else if ((dst_enc < 16) && (src_enc < 16)) {
- Assembler::vpaddb(dst, dst, src, vector_len);
- } else if ((dst_enc < 16) && (nds_enc < 16)) {
- // use nds as scratch for src
- evmovdqul(nds, src, Assembler::AVX_512bit);
- Assembler::vpaddb(dst, dst, nds, vector_len);
- } else if ((src_enc < 16) && (nds_enc < 16)) {
- // use nds as scratch for dst
- evmovdqul(nds, dst, Assembler::AVX_512bit);
- Assembler::vpaddb(nds, nds, src, vector_len);
- evmovdqul(dst, nds, Assembler::AVX_512bit);
- } else if (dst_enc < 16) {
- // use nds as scatch for xmm0 to hold src
- evmovdqul(nds, xmm0, Assembler::AVX_512bit);
- evmovdqul(xmm0, src, Assembler::AVX_512bit);
- Assembler::vpaddb(dst, dst, xmm0, vector_len);
- evmovdqul(xmm0, nds, Assembler::AVX_512bit);
- } else {
- // worse case scenario, all regs are in the upper bank
- push_zmm(xmm1);
- evmovdqul(nds, xmm0, Assembler::AVX_512bit);
- evmovdqul(xmm1, src, Assembler::AVX_512bit);
- evmovdqul(xmm0, dst, Assembler::AVX_512bit);
- Assembler::vpaddb(xmm0, xmm0, xmm1, vector_len);
- evmovdqul(dst, xmm0, Assembler::AVX_512bit);
- evmovdqul(xmm0, nds, Assembler::AVX_512bit);
- pop_zmm(xmm1);
- }
+ assert(((dst->encoding() < 16 && src->encoding() < 16 && nds->encoding() < 16) || VM_Version::supports_avx512vlbw()),"XMM register should be 0-15");
+ Assembler::vpaddb(dst, nds, src, vector_len);
}
void MacroAssembler::vpaddb(XMMRegister dst, XMMRegister nds, Address src, int vector_len) {
- int dst_enc = dst->encoding();
- int nds_enc = nds->encoding();
- if (VM_Version::supports_avxonly() || VM_Version::supports_avx512bw()) {
- Assembler::vpaddb(dst, nds, src, vector_len);
- } else if (dst_enc < 16) {
- Assembler::vpaddb(dst, dst, src, vector_len);
- } else if (nds_enc < 16) {
- // implies dst_enc in upper bank with src as scratch
- evmovdqul(nds, dst, Assembler::AVX_512bit);
- Assembler::vpaddb(nds, nds, src, vector_len);
- evmovdqul(dst, nds, Assembler::AVX_512bit);
- } else {
- // worse case scenario, all regs in upper bank
- evmovdqul(nds, xmm0, Assembler::AVX_512bit);
- evmovdqul(xmm0, dst, Assembler::AVX_512bit);
- Assembler::vpaddb(xmm0, xmm0, src, vector_len);
- evmovdqul(dst, xmm0, Assembler::AVX_512bit);
- evmovdqul(xmm0, nds, Assembler::AVX_512bit);
- }
+ assert(((dst->encoding() < 16 && nds->encoding() < 16) || VM_Version::supports_avx512vlbw()),"XMM register should be 0-15");
+ Assembler::vpaddb(dst, nds, src, vector_len);
}
void MacroAssembler::vpaddw(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {
- int dst_enc = dst->encoding();
- int nds_enc = nds->encoding();
- int src_enc = src->encoding();
- if (VM_Version::supports_avxonly() || VM_Version::supports_avx512bw()) {
- Assembler::vpaddw(dst, nds, src, vector_len);
- } else if ((dst_enc < 16) && (src_enc < 16)) {
- Assembler::vpaddw(dst, dst, src, vector_len);
- } else if ((dst_enc < 16) && (nds_enc < 16)) {
- // use nds as scratch for src
- evmovdqul(nds, src, Assembler::AVX_512bit);
- Assembler::vpaddw(dst, dst, nds, vector_len);
- } else if ((src_enc < 16) && (nds_enc < 16)) {
- // use nds as scratch for dst
- evmovdqul(nds, dst, Assembler::AVX_512bit);
- Assembler::vpaddw(nds, nds, src, vector_len);
- evmovdqul(dst, nds, Assembler::AVX_512bit);
- } else if (dst_enc < 16) {
- // use nds as scatch for xmm0 to hold src
- evmovdqul(nds, xmm0, Assembler::AVX_512bit);
- evmovdqul(xmm0, src, Assembler::AVX_512bit);
- Assembler::vpaddw(dst, dst, xmm0, vector_len);
- evmovdqul(xmm0, nds, Assembler::AVX_512bit);
- } else {
- // worse case scenario, all regs are in the upper bank
- push_zmm(xmm1);
- evmovdqul(nds, xmm0, Assembler::AVX_512bit);
- evmovdqul(xmm1, src, Assembler::AVX_512bit);
- evmovdqul(xmm0, dst, Assembler::AVX_512bit);
- Assembler::vpaddw(xmm0, xmm0, xmm1, vector_len);
- evmovdqul(dst, xmm0, Assembler::AVX_512bit);
- evmovdqul(xmm0, nds, Assembler::AVX_512bit);
- pop_zmm(xmm1);
- }
+ assert(((dst->encoding() < 16 && src->encoding() < 16 && nds->encoding() < 16) || VM_Version::supports_avx512vlbw()),"XMM register should be 0-15");
+ Assembler::vpaddw(dst, nds, src, vector_len);
}
void MacroAssembler::vpaddw(XMMRegister dst, XMMRegister nds, Address src, int vector_len) {
- int dst_enc = dst->encoding();
- int nds_enc = nds->encoding();
- if (VM_Version::supports_avxonly() || VM_Version::supports_avx512bw()) {
- Assembler::vpaddw(dst, nds, src, vector_len);
- } else if (dst_enc < 16) {
- Assembler::vpaddw(dst, dst, src, vector_len);
- } else if (nds_enc < 16) {
- // implies dst_enc in upper bank with nds as scratch
- evmovdqul(nds, dst, Assembler::AVX_512bit);
- Assembler::vpaddw(nds, nds, src, vector_len);
- evmovdqul(dst, nds, Assembler::AVX_512bit);
- } else {
- // worse case scenario, all regs in upper bank
- evmovdqul(nds, xmm0, Assembler::AVX_512bit);
- evmovdqul(xmm0, dst, Assembler::AVX_512bit);
- Assembler::vpaddw(xmm0, xmm0, src, vector_len);
- evmovdqul(dst, xmm0, Assembler::AVX_512bit);
- evmovdqul(xmm0, nds, Assembler::AVX_512bit);
- }
+ assert(((dst->encoding() < 16 && nds->encoding() < 16) || VM_Version::supports_avx512vlbw()),"XMM register should be 0-15");
+ Assembler::vpaddw(dst, nds, src, vector_len);
}
void MacroAssembler::vpand(XMMRegister dst, XMMRegister nds, AddressLiteral src, int vector_len) {
@@ -4178,627 +3844,109 @@
}
}
-void MacroAssembler::vpbroadcastw(XMMRegister dst, XMMRegister src) {
- int dst_enc = dst->encoding();
- int src_enc = src->encoding();
- if (VM_Version::supports_avxonly() || VM_Version::supports_avx512bw()) {
- Assembler::vpbroadcastw(dst, src);
- } else if ((dst_enc < 16) && (src_enc < 16)) {
- Assembler::vpbroadcastw(dst, src);
- } else if (src_enc < 16) {
- push_zmm(xmm0);
- evmovdqul(xmm0, dst, Assembler::AVX_512bit);
- Assembler::vpbroadcastw(xmm0, src);
- movdqu(dst, xmm0);
- pop_zmm(xmm0);
- } else if (dst_enc < 16) {
- push_zmm(xmm0);
- evmovdqul(xmm0, src, Assembler::AVX_512bit);
- Assembler::vpbroadcastw(dst, xmm0);
- pop_zmm(xmm0);
- } else {
- push_zmm(xmm0);
- push_zmm(xmm1);
- movdqu(xmm0, src);
- movdqu(xmm1, dst);
- Assembler::vpbroadcastw(xmm1, xmm0);
- movdqu(dst, xmm1);
- pop_zmm(xmm1);
- pop_zmm(xmm0);
- }
+void MacroAssembler::vpbroadcastw(XMMRegister dst, XMMRegister src, int vector_len) {
+ assert(((dst->encoding() < 16 && src->encoding() < 16) || VM_Version::supports_avx512vlbw()),"XMM register should be 0-15");
+ Assembler::vpbroadcastw(dst, src, vector_len);
}
void MacroAssembler::vpcmpeqb(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {
- int dst_enc = dst->encoding();
- int nds_enc = nds->encoding();
- int src_enc = src->encoding();
- assert(dst_enc == nds_enc, "");
- if ((dst_enc < 16) && (src_enc < 16)) {
- Assembler::vpcmpeqb(dst, nds, src, vector_len);
- } else if (src_enc < 16) {
- push_zmm(xmm0);
- evmovdqul(xmm0, dst, Assembler::AVX_512bit);
- Assembler::vpcmpeqb(xmm0, xmm0, src, vector_len);
- movdqu(dst, xmm0);
- pop_zmm(xmm0);
- } else if (dst_enc < 16) {
- push_zmm(xmm0);
- evmovdqul(xmm0, src, Assembler::AVX_512bit);
- Assembler::vpcmpeqb(dst, dst, xmm0, vector_len);
- pop_zmm(xmm0);
- } else {
- push_zmm(xmm0);
- push_zmm(xmm1);
- movdqu(xmm0, src);
- movdqu(xmm1, dst);
- Assembler::vpcmpeqb(xmm1, xmm1, xmm0, vector_len);
- movdqu(dst, xmm1);
- pop_zmm(xmm1);
- pop_zmm(xmm0);
- }
+ assert(((dst->encoding() < 16 && src->encoding() < 16 && nds->encoding() < 16) || VM_Version::supports_avx512vlbw()),"XMM register should be 0-15");
+ Assembler::vpcmpeqb(dst, nds, src, vector_len);
}
void MacroAssembler::vpcmpeqw(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {
- int dst_enc = dst->encoding();
- int nds_enc = nds->encoding();
- int src_enc = src->encoding();
- assert(dst_enc == nds_enc, "");
- if ((dst_enc < 16) && (src_enc < 16)) {
- Assembler::vpcmpeqw(dst, nds, src, vector_len);
- } else if (src_enc < 16) {
- push_zmm(xmm0);
- evmovdqul(xmm0, dst, Assembler::AVX_512bit);
- Assembler::vpcmpeqw(xmm0, xmm0, src, vector_len);
- movdqu(dst, xmm0);
- pop_zmm(xmm0);
- } else if (dst_enc < 16) {
- push_zmm(xmm0);
- evmovdqul(xmm0, src, Assembler::AVX_512bit);
- Assembler::vpcmpeqw(dst, dst, xmm0, vector_len);
- pop_zmm(xmm0);
- } else {
- push_zmm(xmm0);
- push_zmm(xmm1);
- movdqu(xmm0, src);
- movdqu(xmm1, dst);
- Assembler::vpcmpeqw(xmm1, xmm1, xmm0, vector_len);
- movdqu(dst, xmm1);
- pop_zmm(xmm1);
- pop_zmm(xmm0);
- }
+ assert(((dst->encoding() < 16 && src->encoding() < 16 && nds->encoding() < 16) || VM_Version::supports_avx512vlbw()),"XMM register should be 0-15");
+ Assembler::vpcmpeqw(dst, nds, src, vector_len);
}
void MacroAssembler::vpmovzxbw(XMMRegister dst, Address src, int vector_len) {
- int dst_enc = dst->encoding();
- if (VM_Version::supports_avxonly() || VM_Version::supports_avx512bw()) {
- Assembler::vpmovzxbw(dst, src, vector_len);
- } else if (dst_enc < 16) {
- Assembler::vpmovzxbw(dst, src, vector_len);
- } else {
- push_zmm(xmm0);
- evmovdqul(xmm0, dst, Assembler::AVX_512bit);
- Assembler::vpmovzxbw(xmm0, src, vector_len);
- movdqu(dst, xmm0);
- pop_zmm(xmm0);
- }
+ assert(((dst->encoding() < 16) || VM_Version::supports_avx512vlbw()),"XMM register should be 0-15");
+ Assembler::vpmovzxbw(dst, src, vector_len);
}
void MacroAssembler::vpmovmskb(Register dst, XMMRegister src) {
- int src_enc = src->encoding();
- if (src_enc < 16) {
- Assembler::vpmovmskb(dst, src);
- } else {
- push_zmm(xmm0);
- evmovdqul(xmm0, src, Assembler::AVX_512bit);
- Assembler::vpmovmskb(dst, xmm0);
- pop_zmm(xmm0);
- }
+ assert((src->encoding() < 16),"XMM register should be 0-15");
+ Assembler::vpmovmskb(dst, src);
}
void MacroAssembler::vpmullw(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {
- int dst_enc = dst->encoding();
- int nds_enc = nds->encoding();
- int src_enc = src->encoding();
- if (VM_Version::supports_avxonly() || VM_Version::supports_avx512bw()) {
- Assembler::vpmullw(dst, nds, src, vector_len);
- } else if ((dst_enc < 16) && (src_enc < 16)) {
- Assembler::vpmullw(dst, dst, src, vector_len);
- } else if ((dst_enc < 16) && (nds_enc < 16)) {
- // use nds as scratch for src
- evmovdqul(nds, src, Assembler::AVX_512bit);
- Assembler::vpmullw(dst, dst, nds, vector_len);
- } else if ((src_enc < 16) && (nds_enc < 16)) {
- // use nds as scratch for dst
- evmovdqul(nds, dst, Assembler::AVX_512bit);
- Assembler::vpmullw(nds, nds, src, vector_len);
- evmovdqul(dst, nds, Assembler::AVX_512bit);
- } else if (dst_enc < 16) {
- // use nds as scatch for xmm0 to hold src
- evmovdqul(nds, xmm0, Assembler::AVX_512bit);
- evmovdqul(xmm0, src, Assembler::AVX_512bit);
- Assembler::vpmullw(dst, dst, xmm0, vector_len);
- evmovdqul(xmm0, nds, Assembler::AVX_512bit);
- } else {
- // worse case scenario, all regs are in the upper bank
- push_zmm(xmm1);
- evmovdqul(nds, xmm0, Assembler::AVX_512bit);
- evmovdqul(xmm1, src, Assembler::AVX_512bit);
- evmovdqul(xmm0, dst, Assembler::AVX_512bit);
- Assembler::vpmullw(xmm0, xmm0, xmm1, vector_len);
- evmovdqul(dst, xmm0, Assembler::AVX_512bit);
- evmovdqul(xmm0, nds, Assembler::AVX_512bit);
- pop_zmm(xmm1);
- }
+ assert(((dst->encoding() < 16 && src->encoding() < 16 && nds->encoding() < 16) || VM_Version::supports_avx512vlbw()),"XMM register should be 0-15");
+ Assembler::vpmullw(dst, nds, src, vector_len);
}
void MacroAssembler::vpmullw(XMMRegister dst, XMMRegister nds, Address src, int vector_len) {
- int dst_enc = dst->encoding();
- int nds_enc = nds->encoding();
- if (VM_Version::supports_avxonly() || VM_Version::supports_avx512bw()) {
- Assembler::vpmullw(dst, nds, src, vector_len);
- } else if (dst_enc < 16) {
- Assembler::vpmullw(dst, dst, src, vector_len);
- } else if (nds_enc < 16) {
- // implies dst_enc in upper bank with src as scratch
- evmovdqul(nds, dst, Assembler::AVX_512bit);
- Assembler::vpmullw(nds, nds, src, vector_len);
- evmovdqul(dst, nds, Assembler::AVX_512bit);
- } else {
- // worse case scenario, all regs in upper bank
- evmovdqul(nds, xmm0, Assembler::AVX_512bit);
- evmovdqul(xmm0, dst, Assembler::AVX_512bit);
- Assembler::vpmullw(xmm0, xmm0, src, vector_len);
- evmovdqul(dst, xmm0, Assembler::AVX_512bit);
- evmovdqul(xmm0, nds, Assembler::AVX_512bit);
- }
+ assert(((dst->encoding() < 16 && nds->encoding() < 16) || VM_Version::supports_avx512vlbw()),"XMM register should be 0-15");
+ Assembler::vpmullw(dst, nds, src, vector_len);
}
void MacroAssembler::vpsubb(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {
- int dst_enc = dst->encoding();
- int nds_enc = nds->encoding();
- int src_enc = src->encoding();
- if (VM_Version::supports_avxonly() || VM_Version::supports_avx512bw()) {
- Assembler::vpsubb(dst, nds, src, vector_len);
- } else if ((dst_enc < 16) && (src_enc < 16)) {
- Assembler::vpsubb(dst, dst, src, vector_len);
- } else if ((dst_enc < 16) && (nds_enc < 16)) {
- // use nds as scratch for src
- evmovdqul(nds, src, Assembler::AVX_512bit);
- Assembler::vpsubb(dst, dst, nds, vector_len);
- } else if ((src_enc < 16) && (nds_enc < 16)) {
- // use nds as scratch for dst
- evmovdqul(nds, dst, Assembler::AVX_512bit);
- Assembler::vpsubb(nds, nds, src, vector_len);
- evmovdqul(dst, nds, Assembler::AVX_512bit);
- } else if (dst_enc < 16) {
- // use nds as scatch for xmm0 to hold src
- evmovdqul(nds, xmm0, Assembler::AVX_512bit);
- evmovdqul(xmm0, src, Assembler::AVX_512bit);
- Assembler::vpsubb(dst, dst, xmm0, vector_len);
- evmovdqul(xmm0, nds, Assembler::AVX_512bit);
- } else {
- // worse case scenario, all regs are in the upper bank
- push_zmm(xmm1);
- evmovdqul(nds, xmm0, Assembler::AVX_512bit);
- evmovdqul(xmm1, src, Assembler::AVX_512bit);
- evmovdqul(xmm0, dst, Assembler::AVX_512bit);
- Assembler::vpsubb(xmm0, xmm0, xmm1, vector_len);
- evmovdqul(dst, xmm0, Assembler::AVX_512bit);
- evmovdqul(xmm0, nds, Assembler::AVX_512bit);
- pop_zmm(xmm1);
- }
+ assert(((dst->encoding() < 16 && src->encoding() < 16 && nds->encoding() < 16) || VM_Version::supports_avx512vlbw()),"XMM register should be 0-15");
+ Assembler::vpsubb(dst, nds, src, vector_len);
}
void MacroAssembler::vpsubb(XMMRegister dst, XMMRegister nds, Address src, int vector_len) {
- int dst_enc = dst->encoding();
- int nds_enc = nds->encoding();
- if (VM_Version::supports_avxonly() || VM_Version::supports_avx512bw()) {
- Assembler::vpsubb(dst, nds, src, vector_len);
- } else if (dst_enc < 16) {
- Assembler::vpsubb(dst, dst, src, vector_len);
- } else if (nds_enc < 16) {
- // implies dst_enc in upper bank with src as scratch
- evmovdqul(nds, dst, Assembler::AVX_512bit);
- Assembler::vpsubb(nds, nds, src, vector_len);
- evmovdqul(dst, nds, Assembler::AVX_512bit);
- } else {
- // worse case scenario, all regs in upper bank
- evmovdqul(nds, xmm0, Assembler::AVX_512bit);
- evmovdqul(xmm0, dst, Assembler::AVX_512bit);
- Assembler::vpsubb(xmm0, xmm0, src, vector_len);
- evmovdqul(dst, xmm0, Assembler::AVX_512bit);
- evmovdqul(xmm0, nds, Assembler::AVX_512bit);
- }
+ assert(((dst->encoding() < 16 && nds->encoding() < 16) || VM_Version::supports_avx512vlbw()),"XMM register should be 0-15");
+ Assembler::vpsubb(dst, nds, src, vector_len);
}
void MacroAssembler::vpsubw(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {
- int dst_enc = dst->encoding();
- int nds_enc = nds->encoding();
- int src_enc = src->encoding();
- if (VM_Version::supports_avxonly() || VM_Version::supports_avx512bw()) {
- Assembler::vpsubw(dst, nds, src, vector_len);
- } else if ((dst_enc < 16) && (src_enc < 16)) {
- Assembler::vpsubw(dst, dst, src, vector_len);
- } else if ((dst_enc < 16) && (nds_enc < 16)) {
- // use nds as scratch for src
- evmovdqul(nds, src, Assembler::AVX_512bit);
- Assembler::vpsubw(dst, dst, nds, vector_len);
- } else if ((src_enc < 16) && (nds_enc < 16)) {
- // use nds as scratch for dst
- evmovdqul(nds, dst, Assembler::AVX_512bit);
- Assembler::vpsubw(nds, nds, src, vector_len);
- evmovdqul(dst, nds, Assembler::AVX_512bit);
- } else if (dst_enc < 16) {
- // use nds as scatch for xmm0 to hold src
- evmovdqul(nds, xmm0, Assembler::AVX_512bit);
- evmovdqul(xmm0, src, Assembler::AVX_512bit);
- Assembler::vpsubw(dst, dst, xmm0, vector_len);
- evmovdqul(xmm0, nds, Assembler::AVX_512bit);
- } else {
- // worse case scenario, all regs are in the upper bank
- push_zmm(xmm1);
- evmovdqul(nds, xmm0, Assembler::AVX_512bit);
- evmovdqul(xmm1, src, Assembler::AVX_512bit);
- evmovdqul(xmm0, dst, Assembler::AVX_512bit);
- Assembler::vpsubw(xmm0, xmm0, xmm1, vector_len);
- evmovdqul(dst, xmm0, Assembler::AVX_512bit);
- evmovdqul(xmm0, nds, Assembler::AVX_512bit);
- pop_zmm(xmm1);
- }
+ assert(((dst->encoding() < 16 && src->encoding() < 16 && nds->encoding() < 16) || VM_Version::supports_avx512vlbw()),"XMM register should be 0-15");
+ Assembler::vpsubw(dst, nds, src, vector_len);
}
void MacroAssembler::vpsubw(XMMRegister dst, XMMRegister nds, Address src, int vector_len) {
- int dst_enc = dst->encoding();
- int nds_enc = nds->encoding();
- if (VM_Version::supports_avxonly() || VM_Version::supports_avx512bw()) {
- Assembler::vpsubw(dst, nds, src, vector_len);
- } else if (dst_enc < 16) {
- Assembler::vpsubw(dst, dst, src, vector_len);
- } else if (nds_enc < 16) {
- // implies dst_enc in upper bank with src as scratch
- evmovdqul(nds, dst, Assembler::AVX_512bit);
- Assembler::vpsubw(nds, nds, src, vector_len);
- evmovdqul(dst, nds, Assembler::AVX_512bit);
- } else {
- // worse case scenario, all regs in upper bank
- evmovdqul(nds, xmm0, Assembler::AVX_512bit);
- evmovdqul(xmm0, dst, Assembler::AVX_512bit);
- Assembler::vpsubw(xmm0, xmm0, src, vector_len);
- evmovdqul(dst, xmm0, Assembler::AVX_512bit);
- evmovdqul(xmm0, nds, Assembler::AVX_512bit);
- }
+ assert(((dst->encoding() < 16 && nds->encoding() < 16) || VM_Version::supports_avx512vlbw()),"XMM register should be 0-15");
+ Assembler::vpsubw(dst, nds, src, vector_len);
}
void MacroAssembler::vpsraw(XMMRegister dst, XMMRegister nds, XMMRegister shift, int vector_len) {
- int dst_enc = dst->encoding();
- int nds_enc = nds->encoding();
- int shift_enc = shift->encoding();
- if (VM_Version::supports_avxonly() || VM_Version::supports_avx512bw()) {
- Assembler::vpsraw(dst, nds, shift, vector_len);
- } else if ((dst_enc < 16) && (shift_enc < 16)) {
- Assembler::vpsraw(dst, dst, shift, vector_len);
- } else if ((dst_enc < 16) && (nds_enc < 16)) {
- // use nds as scratch with shift
- evmovdqul(nds, shift, Assembler::AVX_512bit);
- Assembler::vpsraw(dst, dst, nds, vector_len);
- } else if ((shift_enc < 16) && (nds_enc < 16)) {
- // use nds as scratch with dst
- evmovdqul(nds, dst, Assembler::AVX_512bit);
- Assembler::vpsraw(nds, nds, shift, vector_len);
- evmovdqul(dst, nds, Assembler::AVX_512bit);
- } else if (dst_enc < 16) {
- // use nds to save a copy of xmm0 and hold shift
- evmovdqul(nds, xmm0, Assembler::AVX_512bit);
- evmovdqul(xmm0, shift, Assembler::AVX_512bit);
- Assembler::vpsraw(dst, dst, xmm0, vector_len);
- evmovdqul(xmm0, nds, Assembler::AVX_512bit);
- } else if (nds_enc < 16) {
- // use nds and dst as temps
- evmovdqul(nds, dst, Assembler::AVX_512bit);
- evmovdqul(dst, xmm0, Assembler::AVX_512bit);
- evmovdqul(xmm0, shift, Assembler::AVX_512bit);
- Assembler::vpsraw(nds, nds, xmm0, vector_len);
- evmovdqul(xmm0, dst, Assembler::AVX_512bit);
- evmovdqul(dst, nds, Assembler::AVX_512bit);
- } else {
- // worse case scenario, all regs are in the upper bank
- push_zmm(xmm1);
- evmovdqul(nds, xmm0, Assembler::AVX_512bit);
- evmovdqul(xmm1, shift, Assembler::AVX_512bit);
- evmovdqul(xmm0, dst, Assembler::AVX_512bit);
- Assembler::vpsraw(xmm0, xmm0, xmm1, vector_len);
- evmovdqul(dst, xmm0, Assembler::AVX_512bit);
- evmovdqul(xmm0, nds, Assembler::AVX_512bit);
- pop_zmm(xmm1);
- }
+ assert(((dst->encoding() < 16 && shift->encoding() < 16 && nds->encoding() < 16) || VM_Version::supports_avx512vlbw()),"XMM register should be 0-15");
+ Assembler::vpsraw(dst, nds, shift, vector_len);
}
void MacroAssembler::vpsraw(XMMRegister dst, XMMRegister nds, int shift, int vector_len) {
- int dst_enc = dst->encoding();
- int nds_enc = nds->encoding();
- if (VM_Version::supports_avxonly() || VM_Version::supports_avx512bw()) {
- Assembler::vpsraw(dst, nds, shift, vector_len);
- } else if (dst_enc < 16) {
- Assembler::vpsraw(dst, dst, shift, vector_len);
- } else if (nds_enc < 16) {
- // use nds as scratch
- evmovdqul(nds, dst, Assembler::AVX_512bit);
- Assembler::vpsraw(nds, nds, shift, vector_len);
- evmovdqul(dst, nds, Assembler::AVX_512bit);
- } else {
- // use nds as scratch for xmm0
- evmovdqul(nds, xmm0, Assembler::AVX_512bit);
- evmovdqul(xmm0, dst, Assembler::AVX_512bit);
- Assembler::vpsraw(xmm0, xmm0, shift, vector_len);
- evmovdqul(dst, xmm0, Assembler::AVX_512bit);
- evmovdqul(xmm0, nds, Assembler::AVX_512bit);
- }
+ assert(((dst->encoding() < 16 && nds->encoding() < 16) || VM_Version::supports_avx512vlbw()),"XMM register should be 0-15");
+ Assembler::vpsraw(dst, nds, shift, vector_len);
}
void MacroAssembler::vpsrlw(XMMRegister dst, XMMRegister nds, XMMRegister shift, int vector_len) {
- int dst_enc = dst->encoding();
- int nds_enc = nds->encoding();
- int shift_enc = shift->encoding();
- if (VM_Version::supports_avxonly() || VM_Version::supports_avx512bw()) {
- Assembler::vpsrlw(dst, nds, shift, vector_len);
- } else if ((dst_enc < 16) && (shift_enc < 16)) {
- Assembler::vpsrlw(dst, dst, shift, vector_len);
- } else if ((dst_enc < 16) && (nds_enc < 16)) {
- // use nds as scratch with shift
- evmovdqul(nds, shift, Assembler::AVX_512bit);
- Assembler::vpsrlw(dst, dst, nds, vector_len);
- } else if ((shift_enc < 16) && (nds_enc < 16)) {
- // use nds as scratch with dst
- evmovdqul(nds, dst, Assembler::AVX_512bit);
- Assembler::vpsrlw(nds, nds, shift, vector_len);
- evmovdqul(dst, nds, Assembler::AVX_512bit);
- } else if (dst_enc < 16) {
- // use nds to save a copy of xmm0 and hold shift
- evmovdqul(nds, xmm0, Assembler::AVX_512bit);
- evmovdqul(xmm0, shift, Assembler::AVX_512bit);
- Assembler::vpsrlw(dst, dst, xmm0, vector_len);
- evmovdqul(xmm0, nds, Assembler::AVX_512bit);
- } else if (nds_enc < 16) {
- // use nds and dst as temps
- evmovdqul(nds, dst, Assembler::AVX_512bit);
- evmovdqul(dst, xmm0, Assembler::AVX_512bit);
- evmovdqul(xmm0, shift, Assembler::AVX_512bit);
- Assembler::vpsrlw(nds, nds, xmm0, vector_len);
- evmovdqul(xmm0, dst, Assembler::AVX_512bit);
- evmovdqul(dst, nds, Assembler::AVX_512bit);
- } else {
- // worse case scenario, all regs are in the upper bank
- push_zmm(xmm1);
- evmovdqul(nds, xmm0, Assembler::AVX_512bit);
- evmovdqul(xmm1, shift, Assembler::AVX_512bit);
- evmovdqul(xmm0, dst, Assembler::AVX_512bit);
- Assembler::vpsrlw(xmm0, xmm0, xmm1, vector_len);
- evmovdqul(dst, xmm0, Assembler::AVX_512bit);
- evmovdqul(xmm0, nds, Assembler::AVX_512bit);
- pop_zmm(xmm1);
- }
+ assert(((dst->encoding() < 16 && shift->encoding() < 16 && nds->encoding() < 16) || VM_Version::supports_avx512vlbw()),"XMM register should be 0-15");
+ Assembler::vpsrlw(dst, nds, shift, vector_len);
}
void MacroAssembler::vpsrlw(XMMRegister dst, XMMRegister nds, int shift, int vector_len) {
- int dst_enc = dst->encoding();
- int nds_enc = nds->encoding();
- if (VM_Version::supports_avxonly() || VM_Version::supports_avx512bw()) {
- Assembler::vpsrlw(dst, nds, shift, vector_len);
- } else if (dst_enc < 16) {
- Assembler::vpsrlw(dst, dst, shift, vector_len);
- } else if (nds_enc < 16) {
- // use nds as scratch
- evmovdqul(nds, dst, Assembler::AVX_512bit);
- Assembler::vpsrlw(nds, nds, shift, vector_len);
- evmovdqul(dst, nds, Assembler::AVX_512bit);
- } else {
- // use nds as scratch for xmm0
- evmovdqul(nds, xmm0, Assembler::AVX_512bit);
- evmovdqul(xmm0, dst, Assembler::AVX_512bit);
- Assembler::vpsrlw(xmm0, xmm0, shift, vector_len);
- evmovdqul(dst, xmm0, Assembler::AVX_512bit);
- evmovdqul(xmm0, nds, Assembler::AVX_512bit);
- }
+ assert(((dst->encoding() < 16 && nds->encoding() < 16) || VM_Version::supports_avx512vlbw()),"XMM register should be 0-15");
+ Assembler::vpsrlw(dst, nds, shift, vector_len);
}
void MacroAssembler::vpsllw(XMMRegister dst, XMMRegister nds, XMMRegister shift, int vector_len) {
- int dst_enc = dst->encoding();
- int nds_enc = nds->encoding();
- int shift_enc = shift->encoding();
- if (VM_Version::supports_avxonly() || VM_Version::supports_avx512bw()) {
- Assembler::vpsllw(dst, nds, shift, vector_len);
- } else if ((dst_enc < 16) && (shift_enc < 16)) {
- Assembler::vpsllw(dst, dst, shift, vector_len);
- } else if ((dst_enc < 16) && (nds_enc < 16)) {
- // use nds as scratch with shift
- evmovdqul(nds, shift, Assembler::AVX_512bit);
- Assembler::vpsllw(dst, dst, nds, vector_len);
- } else if ((shift_enc < 16) && (nds_enc < 16)) {
- // use nds as scratch with dst
- evmovdqul(nds, dst, Assembler::AVX_512bit);
- Assembler::vpsllw(nds, nds, shift, vector_len);
- evmovdqul(dst, nds, Assembler::AVX_512bit);
- } else if (dst_enc < 16) {
- // use nds to save a copy of xmm0 and hold shift
- evmovdqul(nds, xmm0, Assembler::AVX_512bit);
- evmovdqul(xmm0, shift, Assembler::AVX_512bit);
- Assembler::vpsllw(dst, dst, xmm0, vector_len);
- evmovdqul(xmm0, nds, Assembler::AVX_512bit);
- } else if (nds_enc < 16) {
- // use nds and dst as temps
- evmovdqul(nds, dst, Assembler::AVX_512bit);
- evmovdqul(dst, xmm0, Assembler::AVX_512bit);
- evmovdqul(xmm0, shift, Assembler::AVX_512bit);
- Assembler::vpsllw(nds, nds, xmm0, vector_len);
- evmovdqul(xmm0, dst, Assembler::AVX_512bit);
- evmovdqul(dst, nds, Assembler::AVX_512bit);
- } else {
- // worse case scenario, all regs are in the upper bank
- push_zmm(xmm1);
- evmovdqul(nds, xmm0, Assembler::AVX_512bit);
- evmovdqul(xmm1, shift, Assembler::AVX_512bit);
- evmovdqul(xmm0, dst, Assembler::AVX_512bit);
- Assembler::vpsllw(xmm0, xmm0, xmm1, vector_len);
- evmovdqul(dst, xmm0, Assembler::AVX_512bit);
- evmovdqul(xmm0, nds, Assembler::AVX_512bit);
- pop_zmm(xmm1);
- }
+ assert(((dst->encoding() < 16 && shift->encoding() < 16 && nds->encoding() < 16) || VM_Version::supports_avx512vlbw()),"XMM register should be 0-15");
+ Assembler::vpsllw(dst, nds, shift, vector_len);
}
void MacroAssembler::vpsllw(XMMRegister dst, XMMRegister nds, int shift, int vector_len) {
- int dst_enc = dst->encoding();
- int nds_enc = nds->encoding();
- if (VM_Version::supports_avxonly() || VM_Version::supports_avx512bw()) {
- Assembler::vpsllw(dst, nds, shift, vector_len);
- } else if (dst_enc < 16) {
- Assembler::vpsllw(dst, dst, shift, vector_len);
- } else if (nds_enc < 16) {
- // use nds as scratch
- evmovdqul(nds, dst, Assembler::AVX_512bit);
- Assembler::vpsllw(nds, nds, shift, vector_len);
- evmovdqul(dst, nds, Assembler::AVX_512bit);
- } else {
- // use nds as scratch for xmm0
- evmovdqul(nds, xmm0, Assembler::AVX_512bit);
- evmovdqul(xmm0, dst, Assembler::AVX_512bit);
- Assembler::vpsllw(xmm0, xmm0, shift, vector_len);
- evmovdqul(dst, xmm0, Assembler::AVX_512bit);
- evmovdqul(xmm0, nds, Assembler::AVX_512bit);
- }
+ assert(((dst->encoding() < 16 && nds->encoding() < 16) || VM_Version::supports_avx512vlbw()),"XMM register should be 0-15");
+ Assembler::vpsllw(dst, nds, shift, vector_len);
}
void MacroAssembler::vptest(XMMRegister dst, XMMRegister src) {
- int dst_enc = dst->encoding();
- int src_enc = src->encoding();
- if ((dst_enc < 16) && (src_enc < 16)) {
- Assembler::vptest(dst, src);
- } else if (src_enc < 16) {
- push_zmm(xmm0);
- evmovdqul(xmm0, dst, Assembler::AVX_512bit);
- Assembler::vptest(xmm0, src);
- pop_zmm(xmm0);
- } else if (dst_enc < 16) {
- push_zmm(xmm0);
- evmovdqul(xmm0, src, Assembler::AVX_512bit);
- Assembler::vptest(dst, xmm0);
- pop_zmm(xmm0);
- } else {
- push_zmm(xmm0);
- push_zmm(xmm1);
- movdqu(xmm0, src);
- movdqu(xmm1, dst);
- Assembler::vptest(xmm1, xmm0);
- pop_zmm(xmm1);
- pop_zmm(xmm0);
- }
-}
-
-// This instruction exists within macros, ergo we cannot control its input
-// when emitted through those patterns.
+ assert((dst->encoding() < 16 && src->encoding() < 16),"XMM register should be 0-15");
+ Assembler::vptest(dst, src);
+}
+
void MacroAssembler::punpcklbw(XMMRegister dst, XMMRegister src) {
- if (VM_Version::supports_avx512nobw()) {
- int dst_enc = dst->encoding();
- int src_enc = src->encoding();
- if (dst_enc == src_enc) {
- if (dst_enc < 16) {
- Assembler::punpcklbw(dst, src);
- } else {
- push_zmm(xmm0);
- evmovdqul(xmm0, dst, Assembler::AVX_512bit);
- Assembler::punpcklbw(xmm0, xmm0);
- evmovdqul(dst, xmm0, Assembler::AVX_512bit);
- pop_zmm(xmm0);
- }
- } else {
- if ((src_enc < 16) && (dst_enc < 16)) {
- Assembler::punpcklbw(dst, src);
- } else if (src_enc < 16) {
- push_zmm(xmm0);
- evmovdqul(xmm0, dst, Assembler::AVX_512bit);
- Assembler::punpcklbw(xmm0, src);
- evmovdqul(dst, xmm0, Assembler::AVX_512bit);
- pop_zmm(xmm0);
- } else if (dst_enc < 16) {
- push_zmm(xmm0);
- evmovdqul(xmm0, src, Assembler::AVX_512bit);
- Assembler::punpcklbw(dst, xmm0);
- pop_zmm(xmm0);
- } else {
- push_zmm(xmm0);
- push_zmm(xmm1);
- evmovdqul(xmm0, dst, Assembler::AVX_512bit);
- evmovdqul(xmm1, src, Assembler::AVX_512bit);
- Assembler::punpcklbw(xmm0, xmm1);
- evmovdqul(dst, xmm0, Assembler::AVX_512bit);
- pop_zmm(xmm1);
- pop_zmm(xmm0);
- }
- }
- } else {
- Assembler::punpcklbw(dst, src);
- }
+ assert(((dst->encoding() < 16 && src->encoding() < 16) || VM_Version::supports_avx512vlbw()),"XMM register should be 0-15");
+ Assembler::punpcklbw(dst, src);
}
void MacroAssembler::pshufd(XMMRegister dst, Address src, int mode) {
- if (VM_Version::supports_avx512vl()) {
- Assembler::pshufd(dst, src, mode);
- } else {
- int dst_enc = dst->encoding();
- if (dst_enc < 16) {
- Assembler::pshufd(dst, src, mode);
- } else {
- push_zmm(xmm0);
- Assembler::pshufd(xmm0, src, mode);
- evmovdqul(dst, xmm0, Assembler::AVX_512bit);
- pop_zmm(xmm0);
- }
- }
-}
-
-// This instruction exists within macros, ergo we cannot control its input
-// when emitted through those patterns.
+ assert(((dst->encoding() < 16) || VM_Version::supports_avx512vl()),"XMM register should be 0-15");
+ Assembler::pshufd(dst, src, mode);
+}
+
void MacroAssembler::pshuflw(XMMRegister dst, XMMRegister src, int mode) {
- if (VM_Version::supports_avx512nobw()) {
- int dst_enc = dst->encoding();
- int src_enc = src->encoding();
- if (dst_enc == src_enc) {
- if (dst_enc < 16) {
- Assembler::pshuflw(dst, src, mode);
- } else {
- push_zmm(xmm0);
- evmovdqul(xmm0, dst, Assembler::AVX_512bit);
- Assembler::pshuflw(xmm0, xmm0, mode);
- evmovdqul(dst, xmm0, Assembler::AVX_512bit);
- pop_zmm(xmm0);
- }
- } else {
- if ((src_enc < 16) && (dst_enc < 16)) {
- Assembler::pshuflw(dst, src, mode);
- } else if (src_enc < 16) {
- push_zmm(xmm0);
- evmovdqul(xmm0, dst, Assembler::AVX_512bit);
- Assembler::pshuflw(xmm0, src, mode);
- evmovdqul(dst, xmm0, Assembler::AVX_512bit);
- pop_zmm(xmm0);
- } else if (dst_enc < 16) {
- push_zmm(xmm0);
- evmovdqul(xmm0, src, Assembler::AVX_512bit);
- Assembler::pshuflw(dst, xmm0, mode);
- pop_zmm(xmm0);
- } else {
- push_zmm(xmm0);
- push_zmm(xmm1);
- evmovdqul(xmm0, dst, Assembler::AVX_512bit);
- evmovdqul(xmm1, src, Assembler::AVX_512bit);
- Assembler::pshuflw(xmm0, xmm1, mode);
- evmovdqul(dst, xmm0, Assembler::AVX_512bit);
- pop_zmm(xmm1);
- pop_zmm(xmm0);
- }
- }
- } else {
- Assembler::pshuflw(dst, src, mode);
- }
+ assert(((dst->encoding() < 16 && src->encoding() < 16) || VM_Version::supports_avx512vlbw()),"XMM register should be 0-15");
+ Assembler::pshuflw(dst, src, mode);
}
void MacroAssembler::vandpd(XMMRegister dst, XMMRegister nds, AddressLiteral src, int vector_len) {
@@ -4874,47 +4022,13 @@
}
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) {
- push_zmm(xmm0);
- movflt(xmm0, nds);
- vxorps(xmm0, xmm0, src, Assembler::AVX_128bit);
- movflt(dst, xmm0);
- pop_zmm(xmm0);
- } else {
- movflt(dst, nds);
- vxorps(dst, dst, src, Assembler::AVX_128bit);
- }
- } else {
- vxorps(dst, nds, src, Assembler::AVX_128bit);
- }
+ assert(((dst->encoding() < 16 && nds->encoding() < 16) || VM_Version::supports_avx512vldq()),"XMM register should be 0-15");
+ vxorps(dst, nds, src, 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) {
- push_zmm(xmm0);
- movdbl(xmm0, nds);
- vxorpd(xmm0, xmm0, src, Assembler::AVX_128bit);
- movdbl(dst, xmm0);
- pop_zmm(xmm0);
- } else {
- movdbl(dst, nds);
- vxorpd(dst, dst, src, Assembler::AVX_128bit);
- }
- } else {
- vxorpd(dst, nds, src, Assembler::AVX_128bit);
- }
+ assert(((dst->encoding() < 16 && nds->encoding() < 16) || VM_Version::supports_avx512vldq()),"XMM register should be 0-15");
+ vxorpd(dst, nds, src, Assembler::AVX_128bit);
}
void MacroAssembler::vxorpd(XMMRegister dst, XMMRegister nds, AddressLiteral src, int vector_len) {
@@ -7064,7 +6178,7 @@
cmpl(cnt1, 2*stride);
jcc(Assembler::less, SCAN_TO_8_CHAR_INIT);
movdl(vec1, ch);
- vpbroadcastw(vec1, vec1);
+ vpbroadcastw(vec1, vec1, Assembler::AVX_256bit);
vpxor(vec2, vec2);
movl(tmp, cnt1);
andl(tmp, 0xFFFFFFF0); //vector count (in chars)
@@ -7659,7 +6773,7 @@
movl(tmp1, 0x80808080); // create mask to test for Unicode chars in vector
movdl(vec2, tmp1);
- vpbroadcastd(vec2, vec2);
+ vpbroadcastd(vec2, vec2, Assembler::AVX_256bit);
bind(COMPARE_WIDE_VECTORS);
vmovdqu(vec1, Address(ary1, len, Address::times_1));
@@ -8091,7 +7205,7 @@
if (UseAVX > 2 && UseUnalignedLoadStores) {
// Fill 64-byte chunks
Label L_fill_64_bytes_loop, L_check_fill_32_bytes;
- evpbroadcastd(xtmp, xtmp, Assembler::AVX_512bit);
+ vpbroadcastd(xtmp, xtmp, Assembler::AVX_512bit);
subl(count, 16 << shift);
jcc(Assembler::less, L_check_fill_32_bytes);
@@ -8114,7 +7228,7 @@
} else if (UseAVX == 2 && UseUnalignedLoadStores) {
// Fill 64-byte chunks
Label L_fill_64_bytes_loop, L_check_fill_32_bytes;
- vpbroadcastd(xtmp, xtmp);
+ vpbroadcastd(xtmp, xtmp, Assembler::AVX_256bit);
subl(count, 16 << shift);
jcc(Assembler::less, L_check_fill_32_bytes);
@@ -8256,7 +7370,7 @@
Label L_chars_32_check, L_copy_32_chars, L_copy_32_chars_exit;
movl(tmp5, 0xff00ff00); // create mask to test for Unicode chars in vector
movdl(tmp1Reg, tmp5);
- vpbroadcastd(tmp1Reg, tmp1Reg);
+ vpbroadcastd(tmp1Reg, tmp1Reg, Assembler::AVX_256bit);
jmp(L_chars_32_check);
bind(L_copy_32_chars);
--- a/src/hotspot/cpu/x86/macroAssembler_x86.hpp Wed Sep 26 18:36:55 2018 +0100
+++ b/src/hotspot/cpu/x86/macroAssembler_x86.hpp Thu Sep 27 10:49:10 2018 -0700
@@ -482,10 +482,6 @@
// from register xmm0. Otherwise, the value is stored from the FPU stack.
void store_double(Address dst);
- // Save/restore ZMM (512bit) register on stack.
- void push_zmm(XMMRegister reg);
- void pop_zmm(XMMRegister reg);
-
// pushes double TOS element of FPU stack on CPU stack; pops from FPU stack
void push_fTOS();
@@ -1214,9 +1210,11 @@
void vpand(XMMRegister dst, XMMRegister nds, Address src, int vector_len) { Assembler::vpand(dst, nds, src, vector_len); }
void vpand(XMMRegister dst, XMMRegister nds, AddressLiteral src, int vector_len);
- void vpbroadcastw(XMMRegister dst, XMMRegister src);
+ void vpbroadcastw(XMMRegister dst, XMMRegister src, int vector_len);
+ void vpbroadcastw(XMMRegister dst, Address src, int vector_len) { Assembler::vpbroadcastw(dst, src, vector_len); }
void vpcmpeqb(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len);
+
void vpcmpeqw(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len);
void vpmovzxbw(XMMRegister dst, Address src, int vector_len);
--- a/src/hotspot/cpu/x86/vm_version_x86.cpp Wed Sep 26 18:36:55 2018 +0100
+++ b/src/hotspot/cpu/x86/vm_version_x86.cpp Thu Sep 27 10:49:10 2018 -0700
@@ -403,7 +403,7 @@
__ movdl(xmm0, rcx);
__ movl(rcx, 0xffff);
__ kmovwl(k1, rcx);
- __ evpbroadcastd(xmm0, xmm0, Assembler::AVX_512bit);
+ __ vpbroadcastd(xmm0, xmm0, Assembler::AVX_512bit);
__ evmovdqul(xmm7, xmm0, Assembler::AVX_512bit);
#ifdef _LP64
__ evmovdqul(xmm8, xmm0, Assembler::AVX_512bit);
@@ -885,7 +885,7 @@
FLAG_SET_DEFAULT(UseSHA, false);
}
- if (supports_sha() && UseSHA) {
+ if (supports_sha() && supports_sse4_1() && UseSHA) {
if (FLAG_IS_DEFAULT(UseSHA1Intrinsics)) {
FLAG_SET_DEFAULT(UseSHA1Intrinsics, true);
}
@@ -894,7 +894,7 @@
FLAG_SET_DEFAULT(UseSHA1Intrinsics, false);
}
- if (UseSHA) {
+ if (supports_sse4_1() && UseSHA) {
if (FLAG_IS_DEFAULT(UseSHA256Intrinsics)) {
FLAG_SET_DEFAULT(UseSHA256Intrinsics, true);
}
--- a/src/hotspot/cpu/x86/vm_version_x86.hpp Wed Sep 26 18:36:55 2018 +0100
+++ b/src/hotspot/cpu/x86/vm_version_x86.hpp Thu Sep 27 10:49:10 2018 -0700
@@ -816,7 +816,10 @@
static bool supports_avx512cd() { return (_features & CPU_AVX512CD) != 0; }
static bool supports_avx512bw() { return (_features & CPU_AVX512BW) != 0; }
static bool supports_avx512vl() { return (_features & CPU_AVX512VL) != 0; }
- static bool supports_avx512vlbw() { return (supports_avx512bw() && supports_avx512vl()); }
+ static bool supports_avx512vlbw() { return (supports_evex() && supports_avx512bw() && supports_avx512vl()); }
+ static bool supports_avx512vldq() { return (supports_evex() && supports_avx512dq() && supports_avx512vl()); }
+ static bool supports_avx512vlbwdq() { return (supports_evex() && supports_avx512vl() &&
+ supports_avx512bw() && supports_avx512dq()); }
static bool supports_avx512novl() { return (supports_evex() && !supports_avx512vl()); }
static bool supports_avx512nobw() { return (supports_evex() && !supports_avx512bw()); }
static bool supports_avx256only() { return (supports_avx2() && !supports_evex()); }
--- a/src/hotspot/cpu/x86/x86.ad Wed Sep 26 18:36:55 2018 +0100
+++ b/src/hotspot/cpu/x86/x86.ad Thu Sep 27 10:49:10 2018 -0700
@@ -729,6 +729,7 @@
);
reg_class_dynamic float_reg(float_reg_evex, float_reg_legacy, %{ VM_Version::supports_evex() %} );
+reg_class_dynamic float_reg_vl(float_reg_evex, float_reg_legacy, %{ VM_Version::supports_evex() && VM_Version::supports_avx512vl() %} );
// Class for pre evex double registers
reg_class double_reg_legacy(XMM0, XMM0b,
@@ -789,6 +790,7 @@
);
reg_class_dynamic double_reg(double_reg_evex, double_reg_legacy, %{ VM_Version::supports_evex() %} );
+reg_class_dynamic double_reg_vl(double_reg_evex, double_reg_legacy, %{ VM_Version::supports_evex() && VM_Version::supports_avx512vl() %} );
// Class for pre evex 32bit vector registers
reg_class vectors_reg_legacy(XMM0,
@@ -849,6 +851,7 @@
);
reg_class_dynamic vectors_reg(vectors_reg_evex, vectors_reg_legacy, %{ VM_Version::supports_evex() %} );
+reg_class_dynamic vectors_reg_vlbwdq(vectors_reg_evex, vectors_reg_legacy, %{ VM_Version::supports_avx512vlbwdq() %} );
// Class for all 64bit vector registers
reg_class vectord_reg_legacy(XMM0, XMM0b,
@@ -909,6 +912,7 @@
);
reg_class_dynamic vectord_reg(vectord_reg_evex, vectord_reg_legacy, %{ VM_Version::supports_evex() %} );
+reg_class_dynamic vectord_reg_vlbwdq(vectord_reg_evex, vectord_reg_legacy, %{ VM_Version::supports_avx512vlbwdq() %} );
// Class for all 128bit vector registers
reg_class vectorx_reg_legacy(XMM0, XMM0b, XMM0c, XMM0d,
@@ -969,6 +973,7 @@
);
reg_class_dynamic vectorx_reg(vectorx_reg_evex, vectorx_reg_legacy, %{ VM_Version::supports_evex() %} );
+reg_class_dynamic vectorx_reg_vlbwdq(vectorx_reg_evex, vectorx_reg_legacy, %{ VM_Version::supports_avx512vlbwdq() %} );
// Class for all 256bit vector registers
reg_class vectory_reg_legacy(XMM0, XMM0b, XMM0c, XMM0d, XMM0e, XMM0f, XMM0g, XMM0h,
@@ -1029,9 +1034,10 @@
);
reg_class_dynamic vectory_reg(vectory_reg_evex, vectory_reg_legacy, %{ VM_Version::supports_evex() %} );
+reg_class_dynamic vectory_reg_vlbwdq(vectory_reg_evex, vectory_reg_legacy, %{ VM_Version::supports_avx512vlbwdq() %} );
// Class for all 512bit vector registers
-reg_class vectorz_reg(XMM0, XMM0b, XMM0c, XMM0d, XMM0e, XMM0f, XMM0g, XMM0h, XMM0i, XMM0j, XMM0k, XMM0l, XMM0m, XMM0n, XMM0o, XMM0p,
+reg_class vectorz_reg_evex(XMM0, XMM0b, XMM0c, XMM0d, XMM0e, XMM0f, XMM0g, XMM0h, XMM0i, XMM0j, XMM0k, XMM0l, XMM0m, XMM0n, XMM0o, XMM0p,
XMM1, XMM1b, XMM1c, XMM1d, XMM1e, XMM1f, XMM1g, XMM1h, XMM1i, XMM1j, XMM1k, XMM1l, XMM1m, XMM1n, XMM1o, XMM1p,
XMM2, XMM2b, XMM2c, XMM2d, XMM2e, XMM2f, XMM2g, XMM2h, XMM2i, XMM2j, XMM2k, XMM2l, XMM2m, XMM2n, XMM2o, XMM2p,
XMM3, XMM3b, XMM3c, XMM3d, XMM3e, XMM3f, XMM3g, XMM3h, XMM3i, XMM3j, XMM3k, XMM3l, XMM3m, XMM3n, XMM3o, XMM3p,
@@ -1067,6 +1073,30 @@
#endif
);
+// Class for restricted 512bit vector registers
+reg_class vectorz_reg_legacy(XMM0, XMM0b, XMM0c, XMM0d, XMM0e, XMM0f, XMM0g, XMM0h, XMM0i, XMM0j, XMM0k, XMM0l, XMM0m, XMM0n, XMM0o, XMM0p,
+ XMM1, XMM1b, XMM1c, XMM1d, XMM1e, XMM1f, XMM1g, XMM1h, XMM1i, XMM1j, XMM1k, XMM1l, XMM1m, XMM1n, XMM1o, XMM1p,
+ XMM2, XMM2b, XMM2c, XMM2d, XMM2e, XMM2f, XMM2g, XMM2h, XMM2i, XMM2j, XMM2k, XMM2l, XMM2m, XMM2n, XMM2o, XMM2p,
+ XMM3, XMM3b, XMM3c, XMM3d, XMM3e, XMM3f, XMM3g, XMM3h, XMM3i, XMM3j, XMM3k, XMM3l, XMM3m, XMM3n, XMM3o, XMM3p,
+ XMM4, XMM4b, XMM4c, XMM4d, XMM4e, XMM4f, XMM4g, XMM4h, XMM4i, XMM4j, XMM4k, XMM4l, XMM4m, XMM4n, XMM4o, XMM4p,
+ XMM5, XMM5b, XMM5c, XMM5d, XMM5e, XMM5f, XMM5g, XMM5h, XMM5i, XMM5j, XMM5k, XMM5l, XMM5m, XMM5n, XMM5o, XMM5p,
+ XMM6, XMM6b, XMM6c, XMM6d, XMM6e, XMM6f, XMM6g, XMM6h, XMM6i, XMM6j, XMM6k, XMM6l, XMM6m, XMM6n, XMM6o, XMM6p,
+ XMM7, XMM7b, XMM7c, XMM7d, XMM7e, XMM7f, XMM7g, XMM7h, XMM7i, XMM7j, XMM7k, XMM7l, XMM7m, XMM7n, XMM7o, XMM7p
+#ifdef _LP64
+ ,XMM8, XMM8b, XMM8c, XMM8d, XMM8e, XMM8f, XMM8g, XMM8h, XMM8i, XMM8j, XMM8k, XMM8l, XMM8m, XMM8n, XMM8o, XMM8p,
+ XMM9, XMM9b, XMM9c, XMM9d, XMM9e, XMM9f, XMM9g, XMM9h, XMM9i, XMM9j, XMM9k, XMM9l, XMM9m, XMM9n, XMM9o, XMM9p,
+ XMM10, XMM10b, XMM10c, XMM10d, XMM10e, XMM10f, XMM10g, XMM10h, XMM10i, XMM10j, XMM10k, XMM10l, XMM10m, XMM10n, XMM10o, XMM10p,
+ XMM11, XMM11b, XMM11c, XMM11d, XMM11e, XMM11f, XMM11g, XMM11h, XMM11i, XMM11j, XMM11k, XMM11l, XMM11m, XMM11n, XMM11o, XMM11p,
+ XMM12, XMM12b, XMM12c, XMM12d, XMM12e, XMM12f, XMM12g, XMM12h, XMM12i, XMM12j, XMM12k, XMM12l, XMM12m, XMM12n, XMM12o, XMM12p,
+ XMM13, XMM13b, XMM13c, XMM13d, XMM13e, XMM13f, XMM13g, XMM13h, XMM13i, XMM13j, XMM13k, XMM13l, XMM13m, XMM13n, XMM13o, XMM13p,
+ XMM14, XMM14b, XMM14c, XMM14d, XMM14e, XMM14f, XMM14g, XMM14h, XMM14i, XMM14j, XMM14k, XMM14l, XMM14m, XMM14n, XMM14o, XMM14p,
+ XMM15, XMM15b, XMM15c, XMM15d, XMM15e, XMM15f, XMM15g, XMM15h, XMM15i, XMM15j, XMM15k, XMM15l, XMM15m, XMM15n, XMM15o, XMM15p
+#endif
+ );
+
+reg_class_dynamic vectorz_reg(vectorz_reg_evex, vectorz_reg_legacy, %{ VM_Version::supports_evex() %} );
+reg_class_dynamic vectorz_reg_vl(vectorz_reg_evex, vectorz_reg_legacy, %{ VM_Version::supports_evex() && VM_Version::supports_avx512vl() %} );
+
reg_class xmm0_reg(XMM0, XMM0b, XMM0c, XMM0d);
reg_class ymm0_reg(XMM0, XMM0b, XMM0c, XMM0d, XMM0e, XMM0f, XMM0g, XMM0h);
reg_class zmm0_reg(XMM0, XMM0b, XMM0c, XMM0d, XMM0e, XMM0f, XMM0g, XMM0h, XMM0i, XMM0j, XMM0k, XMM0l, XMM0m, XMM0n, XMM0o, XMM0p);
@@ -1487,6 +1517,8 @@
// AVX1 supports 256bit vectors only for FLOAT and DOUBLE.
if (UseAVX > 0 && (bt == T_FLOAT || bt == T_DOUBLE))
size = (UseAVX > 2) ? 64 : 32;
+ if (UseAVX > 2 && (bt == T_BYTE || bt == T_SHORT || bt == T_CHAR))
+ size = (VM_Version::supports_avx512bw()) ? 64 : 32;
// Use flag to limit vector size.
size = MIN2(size,(int)MaxVectorSize);
// Minimum 2 values in vector (or 4 for bytes).
@@ -1528,7 +1560,7 @@
return MIN2(size,max_size);
}
-// Vector ideal reg corresponding to specidied size in bytes
+// Vector ideal reg corresponding to specified size in bytes
const uint Matcher::vector_ideal_reg(int size) {
assert(MaxVectorSize >= size, "");
switch(size) {
@@ -1648,10 +1680,28 @@
case Op_VecS: // copy whole register
case Op_VecD:
case Op_VecX:
+#ifndef LP64
__ movdqu(as_XMMRegister(Matcher::_regEncode[dst_lo]), as_XMMRegister(Matcher::_regEncode[src_lo]));
+#else
+ if ((UseAVX < 3) || VM_Version::supports_avx512vl()) {
+ __ movdqu(as_XMMRegister(Matcher::_regEncode[dst_lo]), as_XMMRegister(Matcher::_regEncode[src_lo]));
+ } else {
+ __ vpxor(as_XMMRegister(Matcher::_regEncode[dst_lo]), as_XMMRegister(Matcher::_regEncode[dst_lo]), 2);
+ __ vinserti32x4(as_XMMRegister(Matcher::_regEncode[dst_lo]), as_XMMRegister(Matcher::_regEncode[dst_lo]), as_XMMRegister(Matcher::_regEncode[src_lo]), 0x0);
+ }
+#endif
break;
case Op_VecY:
+#ifndef LP64
__ vmovdqu(as_XMMRegister(Matcher::_regEncode[dst_lo]), as_XMMRegister(Matcher::_regEncode[src_lo]));
+#else
+ if ((UseAVX < 3) || VM_Version::supports_avx512vl()) {
+ __ vmovdqu(as_XMMRegister(Matcher::_regEncode[dst_lo]), as_XMMRegister(Matcher::_regEncode[src_lo]));
+ } else {
+ __ vpxor(as_XMMRegister(Matcher::_regEncode[dst_lo]), as_XMMRegister(Matcher::_regEncode[dst_lo]), 2);
+ __ vinserti64x4(as_XMMRegister(Matcher::_regEncode[dst_lo]), as_XMMRegister(Matcher::_regEncode[dst_lo]), as_XMMRegister(Matcher::_regEncode[src_lo]), 0x0);
+ }
+#endif
break;
case Op_VecZ:
__ evmovdquq(as_XMMRegister(Matcher::_regEncode[dst_lo]), as_XMMRegister(Matcher::_regEncode[src_lo]), 2);
@@ -1703,10 +1753,28 @@
__ movq(as_XMMRegister(Matcher::_regEncode[reg]), Address(rsp, stack_offset));
break;
case Op_VecX:
+#ifndef LP64
__ movdqu(as_XMMRegister(Matcher::_regEncode[reg]), Address(rsp, stack_offset));
+#else
+ if ((UseAVX < 3) || VM_Version::supports_avx512vl()) {
+ __ movdqu(as_XMMRegister(Matcher::_regEncode[reg]), Address(rsp, stack_offset));
+ } else {
+ __ vpxor(as_XMMRegister(Matcher::_regEncode[reg]), as_XMMRegister(Matcher::_regEncode[reg]), 2);
+ __ vinserti32x4(as_XMMRegister(Matcher::_regEncode[reg]), as_XMMRegister(Matcher::_regEncode[reg]), Address(rsp, stack_offset),0x0);
+ }
+#endif
break;
case Op_VecY:
+#ifndef LP64
__ vmovdqu(as_XMMRegister(Matcher::_regEncode[reg]), Address(rsp, stack_offset));
+#else
+ if ((UseAVX < 3) || VM_Version::supports_avx512vl()) {
+ __ vmovdqu(as_XMMRegister(Matcher::_regEncode[reg]), Address(rsp, stack_offset));
+ } else {
+ __ vpxor(as_XMMRegister(Matcher::_regEncode[reg]), as_XMMRegister(Matcher::_regEncode[reg]), 2);
+ __ vinserti64x4(as_XMMRegister(Matcher::_regEncode[reg]), as_XMMRegister(Matcher::_regEncode[reg]), Address(rsp, stack_offset),0x0);
+ }
+#endif
break;
case Op_VecZ:
__ evmovdquq(as_XMMRegister(Matcher::_regEncode[reg]), Address(rsp, stack_offset), 2);
@@ -1723,10 +1791,28 @@
__ movq(Address(rsp, stack_offset), as_XMMRegister(Matcher::_regEncode[reg]));
break;
case Op_VecX:
+#ifndef LP64
__ movdqu(Address(rsp, stack_offset), as_XMMRegister(Matcher::_regEncode[reg]));
+#else
+ if ((UseAVX < 3) || VM_Version::supports_avx512vl()) {
+ __ movdqu(Address(rsp, stack_offset), as_XMMRegister(Matcher::_regEncode[reg]));
+ }
+ else {
+ __ vextracti32x4(Address(rsp, stack_offset), as_XMMRegister(Matcher::_regEncode[reg]), as_XMMRegister(Matcher::_regEncode[reg]), 0x0);
+ }
+#endif
break;
case Op_VecY:
+#ifndef LP64
__ vmovdqu(Address(rsp, stack_offset), as_XMMRegister(Matcher::_regEncode[reg]));
+#else
+ if ((UseAVX < 3) || VM_Version::supports_avx512vl()) {
+ __ vmovdqu(Address(rsp, stack_offset), as_XMMRegister(Matcher::_regEncode[reg]));
+ }
+ else {
+ __ vextracti64x4(Address(rsp, stack_offset), as_XMMRegister(Matcher::_regEncode[reg]), as_XMMRegister(Matcher::_regEncode[reg]), 0x0);
+ }
+#endif
break;
case Op_VecZ:
__ evmovdquq(Address(rsp, stack_offset), as_XMMRegister(Matcher::_regEncode[reg]), 2);
@@ -1908,7 +1994,6 @@
// in the ADLC because operands constitute user defined types which are used in
// instruction definitions.
-// This one generically applies only for evex, so only one version
operand vecZ() %{
constraint(ALLOC_IN_RC(vectorz_reg));
match(VecZ);
@@ -1917,6 +2002,14 @@
interface(REG_INTER);
%}
+operand legVecZ() %{
+ constraint(ALLOC_IN_RC(vectorz_reg_vl));
+ match(VecZ);
+
+ format %{ %}
+ interface(REG_INTER);
+%}
+
// Comparison Code for FP conditional move
operand cmpOp_vcmppd() %{
match(Bool);
@@ -2547,22 +2640,8 @@
ins_pipe(pipe_slow);
%}
-instruct absF_reg_reg(regF dst, regF src) %{
- predicate(VM_Version::supports_avxonly());
- match(Set dst (AbsF src));
- ins_cost(150);
- format %{ "vandps $dst, $src, [0x7fffffff]\t# abs float by sign masking" %}
- ins_encode %{
- int vector_len = 0;
- __ vandps($dst$$XMMRegister, $src$$XMMRegister,
- ExternalAddress(float_signmask()), vector_len);
- %}
- ins_pipe(pipe_slow);
-%}
-
-#ifdef _LP64
-instruct absF_reg_reg_evex(regF dst, regF src) %{
- predicate(UseAVX > 2 && VM_Version::supports_avx512vl());
+instruct absF_reg_reg(vlRegF dst, vlRegF src) %{
+ predicate(UseAVX > 0);
match(Set dst (AbsF src));
ins_cost(150);
format %{ "vandps $dst, $src, [0x7fffffff]\t# abs float by sign masking" %}
@@ -2574,34 +2653,6 @@
ins_pipe(pipe_slow);
%}
-instruct absF_reg_reg_evex_special(regF dst, regF src1, regF src2) %{
- predicate(VM_Version::supports_avx512novl());
- match(Set dst (AbsF src1));
- effect(TEMP src2);
- ins_cost(150);
- format %{ "vabsss $dst, $src1, $src2, [0x7fffffff]\t# abs float by sign masking" %}
- ins_encode %{
- int vector_len = 0;
- __ vabsss($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister,
- ExternalAddress(float_signmask()), vector_len);
- %}
- ins_pipe(pipe_slow);
-%}
-#else // _LP64
-instruct absF_reg_reg_evex(regF dst, regF src) %{
- predicate(UseAVX > 2);
- match(Set dst (AbsF src));
- ins_cost(150);
- format %{ "vandps $dst, $src, [0x7fffffff]\t# abs float by sign masking" %}
- ins_encode %{
- int vector_len = 0;
- __ vandps($dst$$XMMRegister, $src$$XMMRegister,
- ExternalAddress(float_signmask()), vector_len);
- %}
- ins_pipe(pipe_slow);
-%}
-#endif
-
instruct absD_reg(regD dst) %{
predicate((UseSSE>=2) && (UseAVX == 0));
match(Set dst (AbsD dst));
@@ -2614,23 +2665,8 @@
ins_pipe(pipe_slow);
%}
-instruct absD_reg_reg(regD dst, regD src) %{
- predicate(VM_Version::supports_avxonly());
- match(Set dst (AbsD src));
- ins_cost(150);
- format %{ "vandpd $dst, $src, [0x7fffffffffffffff]\t"
- "# abs double by sign masking" %}
- ins_encode %{
- int vector_len = 0;
- __ vandpd($dst$$XMMRegister, $src$$XMMRegister,
- ExternalAddress(double_signmask()), vector_len);
- %}
- ins_pipe(pipe_slow);
-%}
-
-#ifdef _LP64
-instruct absD_reg_reg_evex(regD dst, regD src) %{
- predicate(UseAVX > 2 && VM_Version::supports_avx512vl());
+instruct absD_reg_reg(vlRegD dst, vlRegD src) %{
+ predicate(UseAVX > 0);
match(Set dst (AbsD src));
ins_cost(150);
format %{ "vandpd $dst, $src, [0x7fffffffffffffff]\t"
@@ -2643,35 +2679,6 @@
ins_pipe(pipe_slow);
%}
-instruct absD_reg_reg_evex_special(regD dst, regD src1, regD src2) %{
- predicate(VM_Version::supports_avx512novl());
- match(Set dst (AbsD src1));
- effect(TEMP src2);
- ins_cost(150);
- format %{ "vabssd $dst, $src1, $src2, [0x7fffffffffffffff]\t# abs float by sign masking" %}
- ins_encode %{
- int vector_len = 0;
- __ vabssd($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister,
- ExternalAddress(double_signmask()), vector_len);
- %}
- ins_pipe(pipe_slow);
-%}
-#else // _LP64
-instruct absD_reg_reg_evex(regD dst, regD src) %{
- predicate(UseAVX > 2);
- match(Set dst (AbsD src));
- ins_cost(150);
- format %{ "vandpd $dst, $src, [0x7fffffffffffffff]\t"
- "# abs double by sign masking" %}
- ins_encode %{
- int vector_len = 0;
- __ vandpd($dst$$XMMRegister, $src$$XMMRegister,
- ExternalAddress(double_signmask()), vector_len);
- %}
- ins_pipe(pipe_slow);
-%}
-#endif
-
instruct negF_reg(regF dst) %{
predicate((UseSSE>=1) && (UseAVX == 0));
match(Set dst (NegF dst));
@@ -2683,7 +2690,7 @@
ins_pipe(pipe_slow);
%}
-instruct negF_reg_reg(regF dst, regF src) %{
+instruct negF_reg_reg(vlRegF dst, vlRegF src) %{
predicate(UseAVX > 0);
match(Set dst (NegF src));
ins_cost(150);
@@ -2707,11 +2714,11 @@
ins_pipe(pipe_slow);
%}
-instruct negD_reg_reg(regD dst, regD src) %{
+instruct negD_reg_reg(vlRegD dst, vlRegD src) %{
predicate(UseAVX > 0);
match(Set dst (NegD src));
ins_cost(150);
- format %{ "vnegatess $dst, $src, [0x8000000000000000]\t"
+ format %{ "vnegatesd $dst, $src, [0x8000000000000000]\t"
"# neg double by sign flipping" %}
ins_encode %{
__ vnegatesd($dst$$XMMRegister, $src$$XMMRegister,
@@ -2835,6 +2842,7 @@
// ====================VECTOR INSTRUCTIONS=====================================
+
// Load vectors (4 bytes long)
instruct loadV4(vecS dst, memory mem) %{
predicate(n->as_LoadVector()->memory_size() == 4);
@@ -2847,6 +2855,26 @@
ins_pipe( pipe_slow );
%}
+// Load vectors (4 bytes long)
+instruct MoveVecS2Leg(legVecS dst, vecS src) %{
+ match(Set dst src);
+ format %{ "movss $dst,$src\t! load vector (4 bytes)" %}
+ ins_encode %{
+ __ movflt($dst$$XMMRegister, $src$$XMMRegister);
+ %}
+ ins_pipe( fpu_reg_reg );
+%}
+
+// Load vectors (4 bytes long)
+instruct MoveLeg2VecS(vecS dst, legVecS src) %{
+ match(Set dst src);
+ format %{ "movss $dst,$src\t! load vector (4 bytes)" %}
+ ins_encode %{
+ __ movflt($dst$$XMMRegister, $src$$XMMRegister);
+ %}
+ ins_pipe( fpu_reg_reg );
+%}
+
// Load vectors (8 bytes long)
instruct loadV8(vecD dst, memory mem) %{
predicate(n->as_LoadVector()->memory_size() == 8);
@@ -2859,6 +2887,26 @@
ins_pipe( pipe_slow );
%}
+// Load vectors (8 bytes long)
+instruct MoveVecD2Leg(legVecD dst, vecD src) %{
+ match(Set dst src);
+ format %{ "movsd $dst,$src\t! load vector (8 bytes)" %}
+ ins_encode %{
+ __ movdbl($dst$$XMMRegister, $src$$XMMRegister);
+ %}
+ ins_pipe( fpu_reg_reg );
+%}
+
+// Load vectors (8 bytes long)
+instruct MoveLeg2VecD(vecD dst, legVecD src) %{
+ match(Set dst src);
+ format %{ "movsd $dst,$src\t! load vector (8 bytes)" %}
+ ins_encode %{
+ __ movdbl($dst$$XMMRegister, $src$$XMMRegister);
+ %}
+ ins_pipe( fpu_reg_reg );
+%}
+
// Load vectors (16 bytes long)
instruct loadV16(vecX dst, memory mem) %{
predicate(n->as_LoadVector()->memory_size() == 16);
@@ -2871,6 +2919,36 @@
ins_pipe( pipe_slow );
%}
+// Load vectors (16 bytes long)
+instruct MoveVecX2Leg(legVecX dst, vecX src) %{
+ match(Set dst src);
+ format %{ "movdqu $dst,$src\t! load vector (16 bytes)" %}
+ ins_encode %{
+ if (UseAVX < 2 || VM_Version::supports_avx512vl()) {
+ __ movdqu($dst$$XMMRegister, $src$$XMMRegister);
+ } else {
+ int vector_len = 2;
+ __ evmovdquq($dst$$XMMRegister, $src$$XMMRegister, vector_len);
+ }
+ %}
+ ins_pipe( fpu_reg_reg );
+%}
+
+// Load vectors (16 bytes long)
+instruct MoveLeg2VecX(vecX dst, legVecX src) %{
+ match(Set dst src);
+ format %{ "movdqu $dst,$src\t! load vector (16 bytes)" %}
+ ins_encode %{
+ if (UseAVX < 2 || VM_Version::supports_avx512vl()) {
+ __ movdqu($dst$$XMMRegister, $src$$XMMRegister);
+ } else {
+ int vector_len = 2;
+ __ evmovdquq($dst$$XMMRegister, $src$$XMMRegister, vector_len);
+ }
+ %}
+ ins_pipe( fpu_reg_reg );
+%}
+
// Load vectors (32 bytes long)
instruct loadV32(vecY dst, memory mem) %{
predicate(n->as_LoadVector()->memory_size() == 32);
@@ -2883,6 +2961,36 @@
ins_pipe( pipe_slow );
%}
+// Load vectors (32 bytes long)
+instruct MoveVecY2Leg(legVecY dst, vecY src) %{
+ match(Set dst src);
+ format %{ "vmovdqu $dst,$src\t! load vector (32 bytes)" %}
+ ins_encode %{
+ if (UseAVX < 2 || VM_Version::supports_avx512vl()) {
+ __ vmovdqu($dst$$XMMRegister, $src$$XMMRegister);
+ } else {
+ int vector_len = 2;
+ __ evmovdquq($dst$$XMMRegister, $src$$XMMRegister, vector_len);
+ }
+ %}
+ ins_pipe( fpu_reg_reg );
+%}
+
+// Load vectors (32 bytes long)
+instruct MoveLeg2VecY(vecY dst, legVecY src) %{
+ match(Set dst src);
+ format %{ "vmovdqu $dst,$src\t! load vector (32 bytes)" %}
+ ins_encode %{
+ if (UseAVX < 2 || VM_Version::supports_avx512vl()) {
+ __ vmovdqu($dst$$XMMRegister, $src$$XMMRegister);
+ } else {
+ int vector_len = 2;
+ __ evmovdquq($dst$$XMMRegister, $src$$XMMRegister, vector_len);
+ }
+ %}
+ ins_pipe( fpu_reg_reg );
+%}
+
// Load vectors (64 bytes long)
instruct loadV64_dword(vecZ dst, memory mem) %{
predicate(n->as_LoadVector()->memory_size() == 64 && n->as_LoadVector()->element_size() <= 4);
@@ -2909,6 +3017,26 @@
ins_pipe( pipe_slow );
%}
+instruct MoveVecZ2Leg(legVecZ dst, vecZ src) %{
+ match(Set dst src);
+ format %{ "vmovdquq $dst k0,$src\t! Move vector (64 bytes)" %}
+ ins_encode %{
+ int vector_len = 2;
+ __ evmovdquq($dst$$XMMRegister, $src$$XMMRegister, vector_len);
+ %}
+ ins_pipe( fpu_reg_reg );
+%}
+
+instruct MoveLeg2VecZ(vecZ dst, legVecZ src) %{
+ match(Set dst src);
+ format %{ "vmovdquq $dst k0,$src\t! Move vector (64 bytes)" %}
+ ins_encode %{
+ int vector_len = 2;
+ __ evmovdquq($dst$$XMMRegister, $src$$XMMRegister, vector_len);
+ %}
+ ins_pipe( fpu_reg_reg );
+%}
+
// Store vectors
instruct storeV4(memory mem, vecS src) %{
predicate(n->as_StoreVector()->memory_size() == 4);
@@ -3068,6 +3196,44 @@
ins_pipe( pipe_slow );
%}
+instruct Repl64B(legVecZ dst, rRegI src) %{
+ predicate(n->as_Vector()->length() == 64 && !VM_Version::supports_avx512vlbw());
+ match(Set dst (ReplicateB src));
+ format %{ "movd $dst,$src\n\t"
+ "punpcklbw $dst,$dst\n\t"
+ "pshuflw $dst,$dst,0x00\n\t"
+ "punpcklqdq $dst,$dst\n\t"
+ "vinserti128_high $dst,$dst\t"
+ "vinserti64x4 $dst,$dst,$dst,0x1\t! replicate64B" %}
+ ins_encode %{
+ __ movdl($dst$$XMMRegister, $src$$Register);
+ __ punpcklbw($dst$$XMMRegister, $dst$$XMMRegister);
+ __ pshuflw($dst$$XMMRegister, $dst$$XMMRegister, 0x00);
+ __ punpcklqdq($dst$$XMMRegister, $dst$$XMMRegister);
+ __ vinserti128_high($dst$$XMMRegister, $dst$$XMMRegister);
+ __ vinserti64x4($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister, 0x1);
+ %}
+ ins_pipe( pipe_slow );
+%}
+
+instruct Repl64B_mem(legVecZ dst, memory mem) %{
+ predicate(n->as_Vector()->length() == 64 && !VM_Version::supports_avx512vlbw());
+ match(Set dst (ReplicateB (LoadB mem)));
+ format %{ "punpcklbw $dst,$mem\n\t"
+ "pshuflw $dst,$dst,0x00\n\t"
+ "punpcklqdq $dst,$dst\n\t"
+ "vinserti128_high $dst,$dst\t"
+ "vinserti64x4 $dst,$dst,$dst,0x1\t! replicate64B" %}
+ ins_encode %{
+ __ punpcklbw($dst$$XMMRegister, $mem$$Address);
+ __ pshuflw($dst$$XMMRegister, $dst$$XMMRegister, 0x00);
+ __ punpcklqdq($dst$$XMMRegister, $dst$$XMMRegister);
+ __ vinserti128_high($dst$$XMMRegister, $dst$$XMMRegister);
+ __ vinserti64x4($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister, 0x1);
+ %}
+ ins_pipe( pipe_slow );
+%}
+
instruct Repl16B_imm(vecX dst, immI con) %{
predicate(n->as_Vector()->length() == 16 && !VM_Version::supports_avx512vlbw());
match(Set dst (ReplicateB con));
@@ -3094,6 +3260,22 @@
ins_pipe( pipe_slow );
%}
+instruct Repl64B_imm(legVecZ dst, immI con) %{
+ predicate(n->as_Vector()->length() == 64 && !VM_Version::supports_avx512vlbw());
+ match(Set dst (ReplicateB con));
+ format %{ "movq $dst,[$constantaddress]\n\t"
+ "punpcklqdq $dst,$dst\n\t"
+ "vinserti128_high $dst,$dst\t"
+ "vinserti64x4 $dst,$dst,$dst,0x1\t! replicate64B($con)" %}
+ ins_encode %{
+ __ movq($dst$$XMMRegister, $constantaddress(replicate8_imm($con$$constant, 1)));
+ __ punpcklqdq($dst$$XMMRegister, $dst$$XMMRegister);
+ __ vinserti128_high($dst$$XMMRegister, $dst$$XMMRegister);
+ __ vinserti64x4($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister, 0x1);
+ %}
+ ins_pipe( pipe_slow );
+%}
+
instruct Repl4S(vecD dst, rRegI src) %{
predicate(n->as_Vector()->length() == 4 && !VM_Version::supports_avx512vlbw());
match(Set dst (ReplicateS src));
@@ -3198,6 +3380,56 @@
ins_pipe( pipe_slow );
%}
+instruct Repl32S(legVecZ dst, rRegI src) %{
+ predicate(n->as_Vector()->length() == 32 && !VM_Version::supports_avx512vlbw());
+ match(Set dst (ReplicateS src));
+ format %{ "movd $dst,$src\n\t"
+ "pshuflw $dst,$dst,0x00\n\t"
+ "punpcklqdq $dst,$dst\n\t"
+ "vinserti128_high $dst,$dst\t"
+ "vinserti64x4 $dst,$dst,$dst,0x1\t! replicate32S" %}
+ ins_encode %{
+ __ movdl($dst$$XMMRegister, $src$$Register);
+ __ pshuflw($dst$$XMMRegister, $dst$$XMMRegister, 0x00);
+ __ punpcklqdq($dst$$XMMRegister, $dst$$XMMRegister);
+ __ vinserti128_high($dst$$XMMRegister, $dst$$XMMRegister);
+ __ vinserti64x4($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister, 0x1);
+ %}
+ ins_pipe( pipe_slow );
+%}
+
+instruct Repl32S_mem(legVecZ dst, memory mem) %{
+ predicate(n->as_Vector()->length() == 32 && !VM_Version::supports_avx512vlbw());
+ match(Set dst (ReplicateS (LoadS mem)));
+ format %{ "pshuflw $dst,$mem,0x00\n\t"
+ "punpcklqdq $dst,$dst\n\t"
+ "vinserti128_high $dst,$dst\t"
+ "vinserti64x4 $dst,$dst,$dst,0x1\t! replicate32S" %}
+ ins_encode %{
+ __ pshuflw($dst$$XMMRegister, $mem$$Address, 0x00);
+ __ punpcklqdq($dst$$XMMRegister, $dst$$XMMRegister);
+ __ vinserti128_high($dst$$XMMRegister, $dst$$XMMRegister);
+ __ vinserti64x4($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister, 0x1);
+ %}
+ ins_pipe( pipe_slow );
+%}
+
+instruct Repl32S_imm(legVecZ dst, immI con) %{
+ predicate(n->as_Vector()->length() == 32 && !VM_Version::supports_avx512vlbw());
+ match(Set dst (ReplicateS con));
+ format %{ "movq $dst,[$constantaddress]\n\t"
+ "punpcklqdq $dst,$dst\n\t"
+ "vinserti128_high $dst,$dst\t"
+ "vinserti64x4 $dst,$dst,$dst,0x1\t! replicate32S($con)" %}
+ ins_encode %{
+ __ movq($dst$$XMMRegister, $constantaddress(replicate8_imm($con$$constant, 2)));
+ __ punpcklqdq($dst$$XMMRegister, $dst$$XMMRegister);
+ __ vinserti128_high($dst$$XMMRegister, $dst$$XMMRegister);
+ __ vinserti64x4($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister, 0x1);
+ %}
+ ins_pipe( pipe_slow );
+%}
+
instruct Repl4I(vecX dst, rRegI src) %{
predicate(n->as_Vector()->length() == 4 && !VM_Version::supports_avx512vl());
match(Set dst (ReplicateI src));
@@ -3246,6 +3478,36 @@
ins_pipe( pipe_slow );
%}
+instruct Repl16I(legVecZ dst, rRegI src) %{
+ predicate(n->as_Vector()->length() == 16 && !VM_Version::supports_avx512vl());
+ match(Set dst (ReplicateI src));
+ format %{ "movd $dst,$src\n\t"
+ "pshufd $dst,$dst,0x00\n\t"
+ "vinserti128_high $dst,$dst\t"
+ "vinserti64x4 $dst,$dst,$dst,0x1\t! replicate16I" %}
+ ins_encode %{
+ __ movdl($dst$$XMMRegister, $src$$Register);
+ __ pshufd($dst$$XMMRegister, $dst$$XMMRegister, 0x00);
+ __ vinserti128_high($dst$$XMMRegister, $dst$$XMMRegister);
+ __ vinserti64x4($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister, 0x1);
+ %}
+ ins_pipe( pipe_slow );
+%}
+
+instruct Repl16I_mem(legVecZ dst, memory mem) %{
+ predicate(n->as_Vector()->length() == 16 && !VM_Version::supports_avx512vl());
+ match(Set dst (ReplicateI (LoadI mem)));
+ format %{ "pshufd $dst,$mem,0x00\n\t"
+ "vinserti128_high $dst,$dst\t"
+ "vinserti64x4 $dst,$dst,$dst,0x1\t! replicate16I" %}
+ ins_encode %{
+ __ pshufd($dst$$XMMRegister, $mem$$Address, 0x00);
+ __ vinserti128_high($dst$$XMMRegister, $dst$$XMMRegister);
+ __ vinserti64x4($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister, 0x1);
+ %}
+ ins_pipe( pipe_slow );
+%}
+
instruct Repl4I_imm(vecX dst, immI con) %{
predicate(n->as_Vector()->length() == 4 && !VM_Version::supports_avx512vl());
match(Set dst (ReplicateI con));
@@ -3272,6 +3534,22 @@
ins_pipe( pipe_slow );
%}
+instruct Repl16I_imm(legVecZ dst, immI con) %{
+ predicate(n->as_Vector()->length() == 16 && !VM_Version::supports_avx512vl());
+ match(Set dst (ReplicateI con));
+ format %{ "movq $dst,[$constantaddress]\t"
+ "punpcklqdq $dst,$dst\n\t"
+ "vinserti128_high $dst,$dst"
+ "vinserti64x4 $dst,$dst,$dst,0x1\t! replicate16I($con)" %}
+ ins_encode %{
+ __ movq($dst$$XMMRegister, $constantaddress(replicate8_imm($con$$constant, 4)));
+ __ punpcklqdq($dst$$XMMRegister, $dst$$XMMRegister);
+ __ vinserti128_high($dst$$XMMRegister, $dst$$XMMRegister);
+ __ vinserti64x4($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister, 0x1);
+ %}
+ ins_pipe( pipe_slow );
+%}
+
// Long could be loaded into xmm register directly from memory.
instruct Repl2L_mem(vecX dst, memory mem) %{
predicate(n->as_Vector()->length() == 2 && !VM_Version::supports_avx512vlbw());
@@ -3300,8 +3578,24 @@
%}
ins_pipe( pipe_slow );
%}
+
+instruct Repl8L(legVecZ dst, rRegL src) %{
+ predicate(n->as_Vector()->length() == 8 && !VM_Version::supports_avx512vl());
+ match(Set dst (ReplicateL src));
+ format %{ "movdq $dst,$src\n\t"
+ "punpcklqdq $dst,$dst\n\t"
+ "vinserti128_high $dst,$dst\t"
+ "vinserti64x4 $dst,$dst,$dst,0x1\t! replicate8L" %}
+ ins_encode %{
+ __ movdq($dst$$XMMRegister, $src$$Register);
+ __ punpcklqdq($dst$$XMMRegister, $dst$$XMMRegister);
+ __ vinserti128_high($dst$$XMMRegister, $dst$$XMMRegister);
+ __ vinserti64x4($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister, 0x1);
+ %}
+ ins_pipe( pipe_slow );
+%}
#else // _LP64
-instruct Repl4L(vecY dst, eRegL src, regD tmp) %{
+instruct Repl4L(vecY dst, eRegL src, vecY tmp) %{
predicate(n->as_Vector()->length() == 4 && !VM_Version::supports_avx512vl());
match(Set dst (ReplicateL src));
effect(TEMP dst, USE src, TEMP tmp);
@@ -3319,6 +3613,27 @@
%}
ins_pipe( pipe_slow );
%}
+
+instruct Repl8L(legVecZ dst, eRegL src, legVecZ tmp) %{
+ predicate(n->as_Vector()->length() == 8 && !VM_Version::supports_avx512vl());
+ match(Set dst (ReplicateL src));
+ effect(TEMP dst, USE src, TEMP tmp);
+ format %{ "movdl $dst,$src.lo\n\t"
+ "movdl $tmp,$src.hi\n\t"
+ "punpckldq $dst,$tmp\n\t"
+ "punpcklqdq $dst,$dst\n\t"
+ "vinserti128_high $dst,$dst\t"
+ "vinserti64x4 $dst,$dst,$dst,0x1\t! replicate8L" %}
+ ins_encode %{
+ __ movdl($dst$$XMMRegister, $src$$Register);
+ __ movdl($tmp$$XMMRegister, HIGH_FROM_LOW($src$$Register));
+ __ punpckldq($dst$$XMMRegister, $tmp$$XMMRegister);
+ __ punpcklqdq($dst$$XMMRegister, $dst$$XMMRegister);
+ __ vinserti128_high($dst$$XMMRegister, $dst$$XMMRegister);
+ __ vinserti64x4($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister, 0x1);
+ %}
+ ins_pipe( pipe_slow );
+%}
#endif // _LP64
instruct Repl4L_imm(vecY dst, immL con) %{
@@ -3335,6 +3650,22 @@
ins_pipe( pipe_slow );
%}
+instruct Repl8L_imm(legVecZ dst, immL con) %{
+ predicate(n->as_Vector()->length() == 8 && !VM_Version::supports_avx512vl());
+ match(Set dst (ReplicateL con));
+ format %{ "movq $dst,[$constantaddress]\n\t"
+ "punpcklqdq $dst,$dst\n\t"
+ "vinserti128_high $dst,$dst\t"
+ "vinserti64x4 $dst,$dst,$dst,0x1\t! replicate8L($con)" %}
+ ins_encode %{
+ __ movq($dst$$XMMRegister, $constantaddress($con));
+ __ punpcklqdq($dst$$XMMRegister, $dst$$XMMRegister);
+ __ vinserti128_high($dst$$XMMRegister, $dst$$XMMRegister);
+ __ vinserti64x4($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister, 0x1);
+ %}
+ ins_pipe( pipe_slow );
+%}
+
instruct Repl4L_mem(vecY dst, memory mem) %{
predicate(n->as_Vector()->length() == 4 && !VM_Version::supports_avx512vl());
match(Set dst (ReplicateL (LoadL mem)));
@@ -3349,6 +3680,22 @@
ins_pipe( pipe_slow );
%}
+instruct Repl8L_mem(legVecZ dst, memory mem) %{
+ predicate(n->as_Vector()->length() == 8 && !VM_Version::supports_avx512vl());
+ match(Set dst (ReplicateL (LoadL mem)));
+ format %{ "movq $dst,$mem\n\t"
+ "punpcklqdq $dst,$dst\n\t"
+ "vinserti128_high $dst,$dst\t"
+ "vinserti64x4 $dst,$dst,$dst,0x1\t! replicate8L" %}
+ ins_encode %{
+ __ movq($dst$$XMMRegister, $mem$$Address);
+ __ punpcklqdq($dst$$XMMRegister, $dst$$XMMRegister);
+ __ vinserti128_high($dst$$XMMRegister, $dst$$XMMRegister);
+ __ vinserti64x4($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister, 0x1);
+ %}
+ ins_pipe( pipe_slow );
+%}
+
instruct Repl2F_mem(vecD dst, memory mem) %{
predicate(n->as_Vector()->length() == 2 && UseAVX > 0 && !VM_Version::supports_avx512vl());
match(Set dst (ReplicateF (LoadF mem)));
@@ -3369,8 +3716,8 @@
ins_pipe( pipe_slow );
%}
-instruct Repl8F(vecY dst, regF src) %{
- predicate(n->as_Vector()->length() == 8 && !VM_Version::supports_avx512vl());
+instruct Repl8F(vecY dst, vlRegF src) %{
+ predicate(n->as_Vector()->length() == 8 && UseAVX > 0 && !VM_Version::supports_avx512vl());
match(Set dst (ReplicateF src));
format %{ "pshufd $dst,$src,0x00\n\t"
"vinsertf128_high $dst,$dst\t! replicate8F" %}
@@ -3393,6 +3740,34 @@
ins_pipe( pipe_slow );
%}
+instruct Repl16F(legVecZ dst, vlRegF src) %{
+ predicate(n->as_Vector()->length() == 16 && UseAVX > 0 && !VM_Version::supports_avx512vl());
+ match(Set dst (ReplicateF src));
+ format %{ "pshufd $dst,$src,0x00\n\t"
+ "vinsertf128_high $dst,$dst\t"
+ "vinserti64x4 $dst,$dst,$dst,0x1\t! replicate16F" %}
+ ins_encode %{
+ __ pshufd($dst$$XMMRegister, $src$$XMMRegister, 0x00);
+ __ vinsertf128_high($dst$$XMMRegister, $dst$$XMMRegister);
+ __ vinserti64x4($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister, 0x1);
+ %}
+ ins_pipe( pipe_slow );
+%}
+
+instruct Repl16F_mem(legVecZ dst, memory mem) %{
+ predicate(n->as_Vector()->length() == 16 && !VM_Version::supports_avx512vl());
+ match(Set dst (ReplicateF (LoadF mem)));
+ format %{ "pshufd $dst,$mem,0x00\n\t"
+ "vinsertf128_high $dst,$dst\t"
+ "vinserti64x4 $dst,$dst,$dst,0x1\t! replicate16F" %}
+ ins_encode %{
+ __ pshufd($dst$$XMMRegister, $mem$$Address, 0x00);
+ __ vinsertf128_high($dst$$XMMRegister, $dst$$XMMRegister);
+ __ vinserti64x4($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister, 0x1);
+ %}
+ ins_pipe( pipe_slow );
+%}
+
instruct Repl2F_zero(vecD dst, immF0 zero) %{
predicate(n->as_Vector()->length() == 2 && UseAVX < 3);
match(Set dst (ReplicateF zero));
@@ -3434,8 +3809,8 @@
ins_pipe( pipe_slow );
%}
-instruct Repl4D(vecY dst, regD src) %{
- predicate(n->as_Vector()->length() == 4 && !VM_Version::supports_avx512vl());
+instruct Repl4D(vecY dst, vlRegD src) %{
+ predicate(n->as_Vector()->length() == 4 && UseAVX > 0 && !VM_Version::supports_avx512vl());
match(Set dst (ReplicateD src));
format %{ "pshufd $dst,$src,0x44\n\t"
"vinsertf128_high $dst,$dst\t! replicate4D" %}
@@ -3458,6 +3833,34 @@
ins_pipe( pipe_slow );
%}
+instruct Repl8D(legVecZ dst, vlRegD src) %{
+ predicate(n->as_Vector()->length() == 8 && UseAVX > 0 && !VM_Version::supports_avx512vl());
+ match(Set dst (ReplicateD src));
+ format %{ "pshufd $dst,$src,0x44\n\t"
+ "vinsertf128_high $dst,$dst\t"
+ "vinserti64x4 $dst,$dst,$dst,0x1\t! replicate8D" %}
+ ins_encode %{
+ __ pshufd($dst$$XMMRegister, $src$$XMMRegister, 0x44);
+ __ vinsertf128_high($dst$$XMMRegister, $dst$$XMMRegister);
+ __ vinserti64x4($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister, 0x1);
+ %}
+ ins_pipe( pipe_slow );
+%}
+
+instruct Repl8D_mem(legVecZ dst, memory mem) %{
+ predicate(n->as_Vector()->length() == 8 && !VM_Version::supports_avx512vl());
+ match(Set dst (ReplicateD (LoadD mem)));
+ format %{ "pshufd $dst,$mem,0x44\n\t"
+ "vinsertf128_high $dst,$dst\t"
+ "vinserti64x4 $dst,$dst,$dst,0x1\t! replicate8D" %}
+ ins_encode %{
+ __ pshufd($dst$$XMMRegister, $mem$$Address, 0x44);
+ __ vinsertf128_high($dst$$XMMRegister, $dst$$XMMRegister);
+ __ vinserti64x4($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister, 0x1);
+ %}
+ ins_pipe( pipe_slow );
+%}
+
// Replicate double (8 byte) scalar zero to be vector
instruct Repl2D_zero(vecX dst, immD0 zero) %{
predicate(n->as_Vector()->length() == 2 && UseAVX < 3);
@@ -3736,7 +4139,7 @@
ins_pipe( pipe_slow );
%}
#else // _LP64
-instruct Repl2L(vecX dst, eRegL src, regD tmp) %{
+instruct Repl2L(vecX dst, eRegL src, vecX tmp) %{
predicate(n->as_Vector()->length() == 2);
match(Set dst (ReplicateL src));
effect(TEMP dst, USE src, TEMP tmp);
@@ -3791,7 +4194,7 @@
%}
// Replicate float (4 byte) scalar to be vector
-instruct Repl2F(vecD dst, regF src) %{
+instruct Repl2F(vecD dst, vlRegF src) %{
predicate(n->as_Vector()->length() == 2);
match(Set dst (ReplicateF src));
format %{ "pshufd $dst,$dst,0x00\t! replicate2F" %}
@@ -3801,7 +4204,7 @@
ins_pipe( fpu_reg_reg );
%}
-instruct Repl4F(vecX dst, regF src) %{
+instruct Repl4F(vecX dst, vlRegF src) %{
predicate(n->as_Vector()->length() == 4);
match(Set dst (ReplicateF src));
format %{ "pshufd $dst,$dst,0x00\t! replicate4F" %}
@@ -3812,7 +4215,7 @@
%}
// Replicate double (8 bytes) scalar to be vector
-instruct Repl2D(vecX dst, regD src) %{
+instruct Repl2D(vecX dst, vlRegD src) %{
predicate(n->as_Vector()->length() == 2);
match(Set dst (ReplicateD src));
format %{ "pshufd $dst,$src,0x44\t! replicate2D" %}
@@ -3825,31 +4228,31 @@
// ====================EVEX REPLICATE=============================================
instruct Repl4B_mem_evex(vecS dst, memory mem) %{
- predicate(n->as_Vector()->length() == 4 && VM_Version::supports_avx512vlbw());
+ predicate(n->as_Vector()->length() == 4 && UseAVX > 2 && VM_Version::supports_avx512vlbw());
match(Set dst (ReplicateB (LoadB mem)));
format %{ "vpbroadcastb $dst,$mem\t! replicate4B" %}
ins_encode %{
int vector_len = 0;
- __ evpbroadcastb($dst$$XMMRegister, $mem$$Address, vector_len);
+ __ vpbroadcastb($dst$$XMMRegister, $mem$$Address, vector_len);
%}
ins_pipe( pipe_slow );
%}
instruct Repl8B_mem_evex(vecD dst, memory mem) %{
- predicate(n->as_Vector()->length() == 8 && VM_Version::supports_avx512vlbw());
+ predicate(n->as_Vector()->length() == 8 && UseAVX > 2 && VM_Version::supports_avx512vlbw());
match(Set dst (ReplicateB (LoadB mem)));
format %{ "vpbroadcastb $dst,$mem\t! replicate8B" %}
ins_encode %{
int vector_len = 0;
- __ evpbroadcastb($dst$$XMMRegister, $mem$$Address, vector_len);
+ __ vpbroadcastb($dst$$XMMRegister, $mem$$Address, vector_len);
%}
ins_pipe( pipe_slow );
%}
instruct Repl16B_evex(vecX dst, rRegI src) %{
- predicate(n->as_Vector()->length() == 16 && VM_Version::supports_avx512vlbw());
+ predicate(n->as_Vector()->length() == 16 && UseAVX > 2 && VM_Version::supports_avx512vlbw());
match(Set dst (ReplicateB src));
- format %{ "vpbroadcastb $dst,$src\t! replicate16B" %}
+ format %{ "evpbroadcastb $dst,$src\t! replicate16B" %}
ins_encode %{
int vector_len = 0;
__ evpbroadcastb($dst$$XMMRegister, $src$$Register, vector_len);
@@ -3858,20 +4261,20 @@
%}
instruct Repl16B_mem_evex(vecX dst, memory mem) %{
- predicate(n->as_Vector()->length() == 16 && VM_Version::supports_avx512vlbw());
+ predicate(n->as_Vector()->length() == 16 && UseAVX > 2 && VM_Version::supports_avx512vlbw());
match(Set dst (ReplicateB (LoadB mem)));
format %{ "vpbroadcastb $dst,$mem\t! replicate16B" %}
ins_encode %{
int vector_len = 0;
- __ evpbroadcastb($dst$$XMMRegister, $mem$$Address, vector_len);
+ __ vpbroadcastb($dst$$XMMRegister, $mem$$Address, vector_len);
%}
ins_pipe( pipe_slow );
%}
instruct Repl32B_evex(vecY dst, rRegI src) %{
- predicate(n->as_Vector()->length() == 32 && VM_Version::supports_avx512vlbw());
+ predicate(n->as_Vector()->length() == 32 && UseAVX > 2 && VM_Version::supports_avx512vlbw());
match(Set dst (ReplicateB src));
- format %{ "vpbroadcastb $dst,$src\t! replicate32B" %}
+ format %{ "evpbroadcastb $dst,$src\t! replicate32B" %}
ins_encode %{
int vector_len = 1;
__ evpbroadcastb($dst$$XMMRegister, $src$$Register, vector_len);
@@ -3880,20 +4283,20 @@
%}
instruct Repl32B_mem_evex(vecY dst, memory mem) %{
- predicate(n->as_Vector()->length() == 32 && VM_Version::supports_avx512vlbw());
+ predicate(n->as_Vector()->length() == 32 && UseAVX > 2 && VM_Version::supports_avx512vlbw());
match(Set dst (ReplicateB (LoadB mem)));
format %{ "vpbroadcastb $dst,$mem\t! replicate32B" %}
ins_encode %{
int vector_len = 1;
- __ evpbroadcastb($dst$$XMMRegister, $mem$$Address, vector_len);
+ __ vpbroadcastb($dst$$XMMRegister, $mem$$Address, vector_len);
%}
ins_pipe( pipe_slow );
%}
instruct Repl64B_evex(vecZ dst, rRegI src) %{
- predicate(n->as_Vector()->length() == 64 && VM_Version::supports_avx512bw());
+ predicate(n->as_Vector()->length() == 64 && UseAVX > 2 && VM_Version::supports_avx512bw());
match(Set dst (ReplicateB src));
- format %{ "vpbroadcastb $dst,$src\t! upper replicate64B" %}
+ format %{ "evpbroadcastb $dst,$src\t! upper replicate64B" %}
ins_encode %{
int vector_len = 2;
__ evpbroadcastb($dst$$XMMRegister, $src$$Register, vector_len);
@@ -3902,51 +4305,51 @@
%}
instruct Repl64B_mem_evex(vecZ dst, memory mem) %{
- predicate(n->as_Vector()->length() == 64 && VM_Version::supports_avx512bw());
+ predicate(n->as_Vector()->length() == 64 && UseAVX > 2 && VM_Version::supports_avx512bw());
match(Set dst (ReplicateB (LoadB mem)));
format %{ "vpbroadcastb $dst,$mem\t! replicate64B" %}
ins_encode %{
int vector_len = 2;
- __ evpbroadcastb($dst$$XMMRegister, $mem$$Address, vector_len);
+ __ vpbroadcastb($dst$$XMMRegister, $mem$$Address, vector_len);
%}
ins_pipe( pipe_slow );
%}
instruct Repl16B_imm_evex(vecX dst, immI con) %{
- predicate(n->as_Vector()->length() == 16 && VM_Version::supports_avx512vlbw());
+ predicate(n->as_Vector()->length() == 16 && UseAVX > 2 && VM_Version::supports_avx512vlbw());
match(Set dst (ReplicateB con));
format %{ "movq $dst,[$constantaddress]\n\t"
"vpbroadcastb $dst,$dst\t! replicate16B" %}
ins_encode %{
int vector_len = 0;
__ movq($dst$$XMMRegister, $constantaddress(replicate8_imm($con$$constant, 1)));
- __ evpbroadcastb($dst$$XMMRegister, $dst$$XMMRegister, vector_len);
+ __ vpbroadcastb($dst$$XMMRegister, $dst$$XMMRegister, vector_len);
%}
ins_pipe( pipe_slow );
%}
instruct Repl32B_imm_evex(vecY dst, immI con) %{
- predicate(n->as_Vector()->length() == 32 && VM_Version::supports_avx512vlbw());
+ predicate(n->as_Vector()->length() == 32 && UseAVX > 2 && VM_Version::supports_avx512vlbw());
match(Set dst (ReplicateB con));
format %{ "movq $dst,[$constantaddress]\n\t"
"vpbroadcastb $dst,$dst\t! replicate32B" %}
ins_encode %{
int vector_len = 1;
__ movq($dst$$XMMRegister, $constantaddress(replicate8_imm($con$$constant, 1)));
- __ evpbroadcastb($dst$$XMMRegister, $dst$$XMMRegister, vector_len);
+ __ vpbroadcastb($dst$$XMMRegister, $dst$$XMMRegister, vector_len);
%}
ins_pipe( pipe_slow );
%}
instruct Repl64B_imm_evex(vecZ dst, immI con) %{
- predicate(n->as_Vector()->length() == 64 && VM_Version::supports_avx512bw());
+ predicate(n->as_Vector()->length() == 64 && UseAVX > 2 && VM_Version::supports_avx512bw());
match(Set dst (ReplicateB con));
format %{ "movq $dst,[$constantaddress]\n\t"
"vpbroadcastb $dst,$dst\t! upper replicate64B" %}
ins_encode %{
int vector_len = 2;
__ movq($dst$$XMMRegister, $constantaddress(replicate8_imm($con$$constant, 1)));
- __ evpbroadcastb($dst$$XMMRegister, $dst$$XMMRegister, vector_len);
+ __ vpbroadcastb($dst$$XMMRegister, $dst$$XMMRegister, vector_len);
%}
ins_pipe( pipe_slow );
%}
@@ -3964,9 +4367,9 @@
%}
instruct Repl4S_evex(vecD dst, rRegI src) %{
- predicate(n->as_Vector()->length() == 4 && VM_Version::supports_avx512vlbw());
+ predicate(n->as_Vector()->length() == 4 && UseAVX > 2 && VM_Version::supports_avx512vlbw());
match(Set dst (ReplicateS src));
- format %{ "vpbroadcastw $dst,$src\t! replicate4S" %}
+ format %{ "evpbroadcastw $dst,$src\t! replicate4S" %}
ins_encode %{
int vector_len = 0;
__ evpbroadcastw($dst$$XMMRegister, $src$$Register, vector_len);
@@ -3975,20 +4378,20 @@
%}
instruct Repl4S_mem_evex(vecD dst, memory mem) %{
- predicate(n->as_Vector()->length() == 4 && VM_Version::supports_avx512vlbw());
+ predicate(n->as_Vector()->length() == 4 && UseAVX > 2 && VM_Version::supports_avx512vlbw());
match(Set dst (ReplicateS (LoadS mem)));
format %{ "vpbroadcastw $dst,$mem\t! replicate4S" %}
ins_encode %{
int vector_len = 0;
- __ evpbroadcastw($dst$$XMMRegister, $mem$$Address, vector_len);
+ __ vpbroadcastw($dst$$XMMRegister, $mem$$Address, vector_len);
%}
ins_pipe( pipe_slow );
%}
instruct Repl8S_evex(vecX dst, rRegI src) %{
- predicate(n->as_Vector()->length() == 8 && VM_Version::supports_avx512vlbw());
+ predicate(n->as_Vector()->length() == 8 && UseAVX > 2 && VM_Version::supports_avx512vlbw());
match(Set dst (ReplicateS src));
- format %{ "vpbroadcastw $dst,$src\t! replicate8S" %}
+ format %{ "evpbroadcastw $dst,$src\t! replicate8S" %}
ins_encode %{
int vector_len = 0;
__ evpbroadcastw($dst$$XMMRegister, $src$$Register, vector_len);
@@ -3997,20 +4400,20 @@
%}
instruct Repl8S_mem_evex(vecX dst, memory mem) %{
- predicate(n->as_Vector()->length() == 8 && VM_Version::supports_avx512vlbw());
+ predicate(n->as_Vector()->length() == 8 && UseAVX > 2 && VM_Version::supports_avx512vlbw());
match(Set dst (ReplicateS (LoadS mem)));
format %{ "vpbroadcastw $dst,$mem\t! replicate8S" %}
ins_encode %{
int vector_len = 0;
- __ evpbroadcastw($dst$$XMMRegister, $mem$$Address, vector_len);
+ __ vpbroadcastw($dst$$XMMRegister, $mem$$Address, vector_len);
%}
ins_pipe( pipe_slow );
%}
instruct Repl16S_evex(vecY dst, rRegI src) %{
- predicate(n->as_Vector()->length() == 16 && VM_Version::supports_avx512vlbw());
+ predicate(n->as_Vector()->length() == 16 && UseAVX > 2 && VM_Version::supports_avx512vlbw());
match(Set dst (ReplicateS src));
- format %{ "vpbroadcastw $dst,$src\t! replicate16S" %}
+ format %{ "evpbroadcastw $dst,$src\t! replicate16S" %}
ins_encode %{
int vector_len = 1;
__ evpbroadcastw($dst$$XMMRegister, $src$$Register, vector_len);
@@ -4019,20 +4422,20 @@
%}
instruct Repl16S_mem_evex(vecY dst, memory mem) %{
- predicate(n->as_Vector()->length() == 16 && VM_Version::supports_avx512vlbw());
+ predicate(n->as_Vector()->length() == 16 && UseAVX > 2 && VM_Version::supports_avx512vlbw());
match(Set dst (ReplicateS (LoadS mem)));
format %{ "vpbroadcastw $dst,$mem\t! replicate16S" %}
ins_encode %{
int vector_len = 1;
- __ evpbroadcastw($dst$$XMMRegister, $mem$$Address, vector_len);
+ __ vpbroadcastw($dst$$XMMRegister, $mem$$Address, vector_len);
%}
ins_pipe( pipe_slow );
%}
instruct Repl32S_evex(vecZ dst, rRegI src) %{
- predicate(n->as_Vector()->length() == 32 && VM_Version::supports_avx512bw());
+ predicate(n->as_Vector()->length() == 32 && UseAVX > 2 && VM_Version::supports_avx512bw());
match(Set dst (ReplicateS src));
- format %{ "vpbroadcastw $dst,$src\t! replicate32S" %}
+ format %{ "evpbroadcastw $dst,$src\t! replicate32S" %}
ins_encode %{
int vector_len = 2;
__ evpbroadcastw($dst$$XMMRegister, $src$$Register, vector_len);
@@ -4041,51 +4444,51 @@
%}
instruct Repl32S_mem_evex(vecZ dst, memory mem) %{
- predicate(n->as_Vector()->length() == 32 && VM_Version::supports_avx512bw());
+ predicate(n->as_Vector()->length() == 32 && UseAVX > 2 && VM_Version::supports_avx512bw());
match(Set dst (ReplicateS (LoadS mem)));
format %{ "vpbroadcastw $dst,$mem\t! replicate32S" %}
ins_encode %{
int vector_len = 2;
- __ evpbroadcastw($dst$$XMMRegister, $mem$$Address, vector_len);
+ __ vpbroadcastw($dst$$XMMRegister, $mem$$Address, vector_len);
%}
ins_pipe( pipe_slow );
%}
instruct Repl8S_imm_evex(vecX dst, immI con) %{
- predicate(n->as_Vector()->length() == 8 && VM_Version::supports_avx512vlbw());
+ predicate(n->as_Vector()->length() == 8 && UseAVX > 2 && VM_Version::supports_avx512vlbw());
match(Set dst (ReplicateS con));
format %{ "movq $dst,[$constantaddress]\n\t"
"vpbroadcastw $dst,$dst\t! replicate8S" %}
ins_encode %{
int vector_len = 0;
__ movq($dst$$XMMRegister, $constantaddress(replicate8_imm($con$$constant, 2)));
- __ evpbroadcastw($dst$$XMMRegister, $dst$$XMMRegister, vector_len);
+ __ vpbroadcastw($dst$$XMMRegister, $dst$$XMMRegister, vector_len);
%}
ins_pipe( pipe_slow );
%}
instruct Repl16S_imm_evex(vecY dst, immI con) %{
- predicate(n->as_Vector()->length() == 16 && VM_Version::supports_avx512vlbw());
+ predicate(n->as_Vector()->length() == 16 && UseAVX > 2 && VM_Version::supports_avx512vlbw());
match(Set dst (ReplicateS con));
format %{ "movq $dst,[$constantaddress]\n\t"
"vpbroadcastw $dst,$dst\t! replicate16S" %}
ins_encode %{
int vector_len = 1;
__ movq($dst$$XMMRegister, $constantaddress(replicate8_imm($con$$constant, 2)));
- __ evpbroadcastw($dst$$XMMRegister, $dst$$XMMRegister, vector_len);
+ __ vpbroadcastw($dst$$XMMRegister, $dst$$XMMRegister, vector_len);
%}
ins_pipe( pipe_slow );
%}
instruct Repl32S_imm_evex(vecZ dst, immI con) %{
- predicate(n->as_Vector()->length() == 32 && VM_Version::supports_avx512bw());
+ predicate(n->as_Vector()->length() == 32 && UseAVX > 2 && VM_Version::supports_avx512bw());
match(Set dst (ReplicateS con));
format %{ "movq $dst,[$constantaddress]\n\t"
"vpbroadcastw $dst,$dst\t! replicate32S" %}
ins_encode %{
int vector_len = 2;
__ movq($dst$$XMMRegister, $constantaddress(replicate8_imm($con$$constant, 2)));
- __ evpbroadcastw($dst$$XMMRegister, $dst$$XMMRegister, vector_len);
+ __ vpbroadcastw($dst$$XMMRegister, $dst$$XMMRegister, vector_len);
%}
ins_pipe( pipe_slow );
%}
@@ -4103,9 +4506,9 @@
%}
instruct Repl4I_evex(vecX dst, rRegI src) %{
- predicate(n->as_Vector()->length() == 4 && VM_Version::supports_avx512vl());
+ predicate(n->as_Vector()->length() == 4 && UseAVX > 2 && VM_Version::supports_avx512vl());
match(Set dst (ReplicateI src));
- format %{ "vpbroadcastd $dst,$src\t! replicate4I" %}
+ format %{ "evpbroadcastd $dst,$src\t! replicate4I" %}
ins_encode %{
int vector_len = 0;
__ evpbroadcastd($dst$$XMMRegister, $src$$Register, vector_len);
@@ -4114,20 +4517,20 @@
%}
instruct Repl4I_mem_evex(vecX dst, memory mem) %{
- predicate(n->as_Vector()->length() == 4 && VM_Version::supports_avx512vl());
+ predicate(n->as_Vector()->length() == 4 && UseAVX > 2 && VM_Version::supports_avx512vl());
match(Set dst (ReplicateI (LoadI mem)));
format %{ "vpbroadcastd $dst,$mem\t! replicate4I" %}
ins_encode %{
int vector_len = 0;
- __ evpbroadcastd($dst$$XMMRegister, $mem$$Address, vector_len);
+ __ vpbroadcastd($dst$$XMMRegister, $mem$$Address, vector_len);
%}
ins_pipe( pipe_slow );
%}
instruct Repl8I_evex(vecY dst, rRegI src) %{
- predicate(n->as_Vector()->length() == 8 && VM_Version::supports_avx512vl());
+ predicate(n->as_Vector()->length() == 8 && UseAVX > 2 && VM_Version::supports_avx512vl());
match(Set dst (ReplicateI src));
- format %{ "vpbroadcastd $dst,$src\t! replicate8I" %}
+ format %{ "evpbroadcastd $dst,$src\t! replicate8I" %}
ins_encode %{
int vector_len = 1;
__ evpbroadcastd($dst$$XMMRegister, $src$$Register, vector_len);
@@ -4136,12 +4539,12 @@
%}
instruct Repl8I_mem_evex(vecY dst, memory mem) %{
- predicate(n->as_Vector()->length() == 8 && VM_Version::supports_avx512vl());
+ predicate(n->as_Vector()->length() == 8 && UseAVX > 2 && VM_Version::supports_avx512vl());
match(Set dst (ReplicateI (LoadI mem)));
format %{ "vpbroadcastd $dst,$mem\t! replicate8I" %}
ins_encode %{
int vector_len = 1;
- __ evpbroadcastd($dst$$XMMRegister, $mem$$Address, vector_len);
+ __ vpbroadcastd($dst$$XMMRegister, $mem$$Address, vector_len);
%}
ins_pipe( pipe_slow );
%}
@@ -4149,7 +4552,7 @@
instruct Repl16I_evex(vecZ dst, rRegI src) %{
predicate(n->as_Vector()->length() == 16 && UseAVX > 2);
match(Set dst (ReplicateI src));
- format %{ "vpbroadcastd $dst,$src\t! replicate16I" %}
+ format %{ "evpbroadcastd $dst,$src\t! replicate16I" %}
ins_encode %{
int vector_len = 2;
__ evpbroadcastd($dst$$XMMRegister, $src$$Register, vector_len);
@@ -4163,33 +4566,33 @@
format %{ "vpbroadcastd $dst,$mem\t! replicate16I" %}
ins_encode %{
int vector_len = 2;
- __ evpbroadcastd($dst$$XMMRegister, $mem$$Address, vector_len);
+ __ vpbroadcastd($dst$$XMMRegister, $mem$$Address, vector_len);
%}
ins_pipe( pipe_slow );
%}
instruct Repl4I_imm_evex(vecX dst, immI con) %{
- predicate(n->as_Vector()->length() == 4 && VM_Version::supports_avx512vl());
+ predicate(n->as_Vector()->length() == 4 && UseAVX > 2 && VM_Version::supports_avx512vl());
match(Set dst (ReplicateI con));
format %{ "movq $dst,[$constantaddress]\t! replicate8I($con)\n\t"
"vpbroadcastd $dst,$dst\t! replicate4I" %}
ins_encode %{
int vector_len = 0;
__ movq($dst$$XMMRegister, $constantaddress(replicate8_imm($con$$constant, 4)));
- __ evpbroadcastd($dst$$XMMRegister, $dst$$XMMRegister, vector_len);
+ __ vpbroadcastd($dst$$XMMRegister, $dst$$XMMRegister, vector_len);
%}
ins_pipe( pipe_slow );
%}
instruct Repl8I_imm_evex(vecY dst, immI con) %{
- predicate(n->as_Vector()->length() == 8 && VM_Version::supports_avx512vl());
+ predicate(n->as_Vector()->length() == 8 && UseAVX > 2 && VM_Version::supports_avx512vl());
match(Set dst (ReplicateI con));
format %{ "movq $dst,[$constantaddress]\t! replicate8I($con)\n\t"
"vpbroadcastd $dst,$dst\t! replicate8I" %}
ins_encode %{
int vector_len = 1;
__ movq($dst$$XMMRegister, $constantaddress(replicate8_imm($con$$constant, 4)));
- __ evpbroadcastd($dst$$XMMRegister, $dst$$XMMRegister, vector_len);
+ __ vpbroadcastd($dst$$XMMRegister, $dst$$XMMRegister, vector_len);
%}
ins_pipe( pipe_slow );
%}
@@ -4202,7 +4605,7 @@
ins_encode %{
int vector_len = 2;
__ movq($dst$$XMMRegister, $constantaddress(replicate8_imm($con$$constant, 4)));
- __ evpbroadcastd($dst$$XMMRegister, $dst$$XMMRegister, vector_len);
+ __ vpbroadcastd($dst$$XMMRegister, $dst$$XMMRegister, vector_len);
%}
ins_pipe( pipe_slow );
%}
@@ -4222,9 +4625,9 @@
// Replicate long (8 byte) scalar to be vector
#ifdef _LP64
instruct Repl4L_evex(vecY dst, rRegL src) %{
- predicate(n->as_Vector()->length() == 4 && VM_Version::supports_avx512vl());
+ predicate(n->as_Vector()->length() == 4 && UseAVX > 2 && VM_Version::supports_avx512vl());
match(Set dst (ReplicateL src));
- format %{ "vpbroadcastq $dst,$src\t! replicate4L" %}
+ format %{ "evpbroadcastq $dst,$src\t! replicate4L" %}
ins_encode %{
int vector_len = 1;
__ evpbroadcastq($dst$$XMMRegister, $src$$Register, vector_len);
@@ -4235,7 +4638,7 @@
instruct Repl8L_evex(vecZ dst, rRegL src) %{
predicate(n->as_Vector()->length() == 8 && UseAVX > 2);
match(Set dst (ReplicateL src));
- format %{ "vpbroadcastq $dst,$src\t! replicate8L" %}
+ format %{ "evpbroadcastq $dst,$src\t! replicate8L" %}
ins_encode %{
int vector_len = 2;
__ evpbroadcastq($dst$$XMMRegister, $src$$Register, vector_len);
@@ -4244,7 +4647,7 @@
%}
#else // _LP64
instruct Repl4L_evex(vecY dst, eRegL src, regD tmp) %{
- predicate(n->as_Vector()->length() == 4 && VM_Version::supports_avx512vl());
+ predicate(n->as_Vector()->length() == 4 && UseAVX > 2 && VM_Version::supports_avx512vl());
match(Set dst (ReplicateL src));
effect(TEMP dst, USE src, TEMP tmp);
format %{ "movdl $dst,$src.lo\n\t"
@@ -4256,12 +4659,12 @@
__ movdl($dst$$XMMRegister, $src$$Register);
__ movdl($tmp$$XMMRegister, HIGH_FROM_LOW($src$$Register));
__ punpckldq($dst$$XMMRegister, $tmp$$XMMRegister);
- __ evpbroadcastq($dst$$XMMRegister, $dst$$XMMRegister, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
-instruct Repl8L_evex(vecZ dst, eRegL src, regD tmp) %{
+ __ vpbroadcastq($dst$$XMMRegister, $dst$$XMMRegister, vector_len);
+ %}
+ ins_pipe( pipe_slow );
+%}
+
+instruct Repl8L_evex(legVecZ dst, eRegL src, legVecZ tmp) %{
predicate(n->as_Vector()->length() == 8 && UseAVX > 2);
match(Set dst (ReplicateL src));
effect(TEMP dst, USE src, TEMP tmp);
@@ -4274,21 +4677,21 @@
__ movdl($dst$$XMMRegister, $src$$Register);
__ movdl($tmp$$XMMRegister, HIGH_FROM_LOW($src$$Register));
__ punpckldq($dst$$XMMRegister, $tmp$$XMMRegister);
- __ evpbroadcastq($dst$$XMMRegister, $dst$$XMMRegister, vector_len);
+ __ vpbroadcastq($dst$$XMMRegister, $dst$$XMMRegister, vector_len);
%}
ins_pipe( pipe_slow );
%}
#endif // _LP64
instruct Repl4L_imm_evex(vecY dst, immL con) %{
- predicate(n->as_Vector()->length() == 4 && VM_Version::supports_avx512vl());
+ predicate(n->as_Vector()->length() == 4 && UseAVX > 2 && VM_Version::supports_avx512vl());
match(Set dst (ReplicateL con));
format %{ "movq $dst,[$constantaddress]\n\t"
"vpbroadcastq $dst,$dst\t! replicate4L" %}
ins_encode %{
int vector_len = 1;
__ movq($dst$$XMMRegister, $constantaddress($con));
- __ evpbroadcastq($dst$$XMMRegister, $dst$$XMMRegister, vector_len);
+ __ vpbroadcastq($dst$$XMMRegister, $dst$$XMMRegister, vector_len);
%}
ins_pipe( pipe_slow );
%}
@@ -4301,29 +4704,29 @@
ins_encode %{
int vector_len = 2;
__ movq($dst$$XMMRegister, $constantaddress($con));
- __ evpbroadcastq($dst$$XMMRegister, $dst$$XMMRegister, vector_len);
+ __ vpbroadcastq($dst$$XMMRegister, $dst$$XMMRegister, vector_len);
%}
ins_pipe( pipe_slow );
%}
instruct Repl2L_mem_evex(vecX dst, memory mem) %{
- predicate(n->as_Vector()->length() == 2 && VM_Version::supports_avx512vl());
+ predicate(n->as_Vector()->length() == 2 && UseAVX > 2 && VM_Version::supports_avx512vl());
match(Set dst (ReplicateL (LoadL mem)));
format %{ "vpbroadcastd $dst,$mem\t! replicate2L" %}
ins_encode %{
int vector_len = 0;
- __ evpbroadcastq($dst$$XMMRegister, $mem$$Address, vector_len);
+ __ vpbroadcastq($dst$$XMMRegister, $mem$$Address, vector_len);
%}
ins_pipe( pipe_slow );
%}
instruct Repl4L_mem_evex(vecY dst, memory mem) %{
- predicate(n->as_Vector()->length() == 4 && VM_Version::supports_avx512vl());
+ predicate(n->as_Vector()->length() == 4 && UseAVX > 2 && VM_Version::supports_avx512vl());
match(Set dst (ReplicateL (LoadL mem)));
format %{ "vpbroadcastd $dst,$mem\t! replicate4L" %}
ins_encode %{
int vector_len = 1;
- __ evpbroadcastq($dst$$XMMRegister, $mem$$Address, vector_len);
+ __ vpbroadcastq($dst$$XMMRegister, $mem$$Address, vector_len);
%}
ins_pipe( pipe_slow );
%}
@@ -4334,7 +4737,7 @@
format %{ "vpbroadcastd $dst,$mem\t! replicate8L" %}
ins_encode %{
int vector_len = 2;
- __ evpbroadcastq($dst$$XMMRegister, $mem$$Address, vector_len);
+ __ vpbroadcastq($dst$$XMMRegister, $mem$$Address, vector_len);
%}
ins_pipe( pipe_slow );
%}
@@ -4352,23 +4755,23 @@
%}
instruct Repl8F_evex(vecY dst, regF src) %{
- predicate(n->as_Vector()->length() == 8 && VM_Version::supports_avx512vl());
+ predicate(n->as_Vector()->length() == 8 && UseAVX > 2 && VM_Version::supports_avx512vl());
match(Set dst (ReplicateF src));
- format %{ "vbroadcastss $dst,$src\t! replicate8F" %}
+ format %{ "vpbroadcastss $dst,$src\t! replicate8F" %}
ins_encode %{
int vector_len = 1;
- __ evpbroadcastss($dst$$XMMRegister, $src$$XMMRegister, vector_len);
+ __ vpbroadcastss($dst$$XMMRegister, $src$$XMMRegister, vector_len);
%}
ins_pipe( pipe_slow );
%}
instruct Repl8F_mem_evex(vecY dst, memory mem) %{
- predicate(n->as_Vector()->length() == 8 && VM_Version::supports_avx512vl());
+ predicate(n->as_Vector()->length() == 8 && UseAVX > 2 && VM_Version::supports_avx512vl());
match(Set dst (ReplicateF (LoadF mem)));
format %{ "vbroadcastss $dst,$mem\t! replicate8F" %}
ins_encode %{
int vector_len = 1;
- __ evpbroadcastss($dst$$XMMRegister, $mem$$Address, vector_len);
+ __ vpbroadcastss($dst$$XMMRegister, $mem$$Address, vector_len);
%}
ins_pipe( pipe_slow );
%}
@@ -4376,10 +4779,10 @@
instruct Repl16F_evex(vecZ dst, regF src) %{
predicate(n->as_Vector()->length() == 16 && UseAVX > 2);
match(Set dst (ReplicateF src));
- format %{ "vbroadcastss $dst,$src\t! replicate16F" %}
+ format %{ "vpbroadcastss $dst,$src\t! replicate16F" %}
ins_encode %{
int vector_len = 2;
- __ evpbroadcastss($dst$$XMMRegister, $src$$XMMRegister, vector_len);
+ __ vpbroadcastss($dst$$XMMRegister, $src$$XMMRegister, vector_len);
%}
ins_pipe( pipe_slow );
%}
@@ -4390,7 +4793,7 @@
format %{ "vbroadcastss $dst,$mem\t! replicate16F" %}
ins_encode %{
int vector_len = 2;
- __ evpbroadcastss($dst$$XMMRegister, $mem$$Address, vector_len);
+ __ vpbroadcastss($dst$$XMMRegister, $mem$$Address, vector_len);
%}
ins_pipe( pipe_slow );
%}
@@ -4444,23 +4847,23 @@
%}
instruct Repl4D_evex(vecY dst, regD src) %{
- predicate(n->as_Vector()->length() == 4 && VM_Version::supports_avx512vl());
+ predicate(n->as_Vector()->length() == 4 && UseAVX > 2 && VM_Version::supports_avx512vl());
match(Set dst (ReplicateD src));
- format %{ "vbroadcastsd $dst,$src\t! replicate4D" %}
+ format %{ "vpbroadcastsd $dst,$src\t! replicate4D" %}
ins_encode %{
int vector_len = 1;
- __ evpbroadcastsd($dst$$XMMRegister, $src$$XMMRegister, vector_len);
+ __ vpbroadcastsd($dst$$XMMRegister, $src$$XMMRegister, vector_len);
%}
ins_pipe( pipe_slow );
%}
instruct Repl4D_mem_evex(vecY dst, memory mem) %{
- predicate(n->as_Vector()->length() == 4 && VM_Version::supports_avx512vl());
+ predicate(n->as_Vector()->length() == 4 && UseAVX > 2 && VM_Version::supports_avx512vl());
match(Set dst (ReplicateD (LoadD mem)));
format %{ "vbroadcastsd $dst,$mem\t! replicate4D" %}
ins_encode %{
int vector_len = 1;
- __ evpbroadcastsd($dst$$XMMRegister, $mem$$Address, vector_len);
+ __ vpbroadcastsd($dst$$XMMRegister, $mem$$Address, vector_len);
%}
ins_pipe( pipe_slow );
%}
@@ -4468,10 +4871,10 @@
instruct Repl8D_evex(vecZ dst, regD src) %{
predicate(n->as_Vector()->length() == 8 && UseAVX > 2);
match(Set dst (ReplicateD src));
- format %{ "vbroadcastsd $dst,$src\t! replicate8D" %}
+ format %{ "vpbroadcastsd $dst,$src\t! replicate8D" %}
ins_encode %{
int vector_len = 2;
- __ evpbroadcastsd($dst$$XMMRegister, $src$$XMMRegister, vector_len);
+ __ vpbroadcastsd($dst$$XMMRegister, $src$$XMMRegister, vector_len);
%}
ins_pipe( pipe_slow );
%}
@@ -4482,7 +4885,7 @@
format %{ "vbroadcastsd $dst,$mem\t! replicate8D" %}
ins_encode %{
int vector_len = 2;
- __ evpbroadcastsd($dst$$XMMRegister, $mem$$Address, vector_len);
+ __ vpbroadcastsd($dst$$XMMRegister, $mem$$Address, vector_len);
%}
ins_pipe( pipe_slow );
%}
@@ -4525,7 +4928,7 @@
// ====================REDUCTION ARITHMETIC=======================================
-instruct rsadd2I_reduction_reg(rRegI dst, rRegI src1, vecD src2, regF tmp, regF tmp2) %{
+instruct rsadd2I_reduction_reg(rRegI dst, rRegI src1, vecD src2, vecD tmp, vecD tmp2) %{
predicate(UseSSE > 2 && UseAVX == 0);
match(Set dst (AddReductionVI src1 src2));
effect(TEMP tmp2, TEMP tmp);
@@ -4544,7 +4947,7 @@
ins_pipe( pipe_slow );
%}
-instruct rvadd2I_reduction_reg(rRegI dst, rRegI src1, vecD src2, regF tmp, regF tmp2) %{
+instruct rvadd2I_reduction_reg(rRegI dst, rRegI src1, vecD src2, vecD tmp, vecD tmp2) %{
predicate(VM_Version::supports_avxonly());
match(Set dst (AddReductionVI src1 src2));
effect(TEMP tmp, TEMP tmp2);
@@ -4562,7 +4965,7 @@
ins_pipe( pipe_slow );
%}
-instruct rvadd2I_reduction_reg_evex(rRegI dst, rRegI src1, vecD src2, regF tmp, regF tmp2) %{
+instruct rvadd2I_reduction_reg_evex(rRegI dst, rRegI src1, vecD src2, vecD tmp, vecD tmp2) %{
predicate(UseAVX > 2);
match(Set dst (AddReductionVI src1 src2));
effect(TEMP tmp, TEMP tmp2);
@@ -4582,7 +4985,7 @@
ins_pipe( pipe_slow );
%}
-instruct rsadd4I_reduction_reg(rRegI dst, rRegI src1, vecX src2, regF tmp, regF tmp2) %{
+instruct rsadd4I_reduction_reg(rRegI dst, rRegI src1, vecX src2, vecX tmp, vecX tmp2) %{
predicate(UseSSE > 2 && UseAVX == 0);
match(Set dst (AddReductionVI src1 src2));
effect(TEMP tmp, TEMP tmp2);
@@ -4603,7 +5006,7 @@
ins_pipe( pipe_slow );
%}
-instruct rvadd4I_reduction_reg(rRegI dst, rRegI src1, vecX src2, regF tmp, regF tmp2) %{
+instruct rvadd4I_reduction_reg(rRegI dst, rRegI src1, vecX src2, vecX tmp, vecX tmp2) %{
predicate(VM_Version::supports_avxonly());
match(Set dst (AddReductionVI src1 src2));
effect(TEMP tmp, TEMP tmp2);
@@ -4623,7 +5026,7 @@
ins_pipe( pipe_slow );
%}
-instruct rvadd4I_reduction_reg_evex(rRegI dst, rRegI src1, vecX src2, regF tmp, regF tmp2) %{
+instruct rvadd4I_reduction_reg_evex(rRegI dst, rRegI src1, vecX src2, vecX tmp, vecX tmp2) %{
predicate(UseAVX > 2);
match(Set dst (AddReductionVI src1 src2));
effect(TEMP tmp, TEMP tmp2);
@@ -4647,7 +5050,7 @@
ins_pipe( pipe_slow );
%}
-instruct rvadd8I_reduction_reg(rRegI dst, rRegI src1, vecY src2, regF tmp, regF tmp2) %{
+instruct rvadd8I_reduction_reg(rRegI dst, rRegI src1, vecY src2, vecY tmp, vecY tmp2) %{
predicate(VM_Version::supports_avxonly());
match(Set dst (AddReductionVI src1 src2));
effect(TEMP tmp, TEMP tmp2);
@@ -4671,7 +5074,7 @@
ins_pipe( pipe_slow );
%}
-instruct rvadd8I_reduction_reg_evex(rRegI dst, rRegI src1, vecY src2, regF tmp, regF tmp2) %{
+instruct rvadd8I_reduction_reg_evex(rRegI dst, rRegI src1, vecY src2, vecY tmp, vecY tmp2) %{
predicate(UseAVX > 2);
match(Set dst (AddReductionVI src1 src2));
effect(TEMP tmp, TEMP tmp2);
@@ -4699,7 +5102,7 @@
ins_pipe( pipe_slow );
%}
-instruct rvadd16I_reduction_reg_evex(rRegI dst, rRegI src1, vecZ src2, regF tmp, regF tmp2, regF tmp3) %{
+instruct rvadd16I_reduction_reg_evex(rRegI dst, rRegI src1, legVecZ src2, legVecZ tmp, legVecZ tmp2, legVecZ tmp3) %{
predicate(UseAVX > 2);
match(Set dst (AddReductionVI src1 src2));
effect(TEMP tmp, TEMP tmp2, TEMP tmp3);
@@ -4731,7 +5134,7 @@
%}
#ifdef _LP64
-instruct rvadd2L_reduction_reg(rRegL dst, rRegL src1, vecX src2, regF tmp, regF tmp2) %{
+instruct rvadd2L_reduction_reg(rRegL dst, rRegL src1, vecX src2, vecX tmp, vecX tmp2) %{
predicate(UseAVX > 2);
match(Set dst (AddReductionVL src1 src2));
effect(TEMP tmp, TEMP tmp2);
@@ -4750,7 +5153,7 @@
ins_pipe( pipe_slow );
%}
-instruct rvadd4L_reduction_reg(rRegL dst, rRegL src1, vecY src2, regF tmp, regF tmp2) %{
+instruct rvadd4L_reduction_reg(rRegL dst, rRegL src1, vecY src2, vecY tmp, vecY tmp2) %{
predicate(UseAVX > 2);
match(Set dst (AddReductionVL src1 src2));
effect(TEMP tmp, TEMP tmp2);
@@ -4773,7 +5176,7 @@
ins_pipe( pipe_slow );
%}
-instruct rvadd8L_reduction_reg(rRegL dst, rRegL src1, vecZ src2, regF tmp, regF tmp2) %{
+instruct rvadd8L_reduction_reg(rRegL dst, rRegL src1, legVecZ src2, legVecZ tmp, legVecZ tmp2) %{
predicate(UseAVX > 2);
match(Set dst (AddReductionVL src1 src2));
effect(TEMP tmp, TEMP tmp2);
@@ -4801,7 +5204,7 @@
%}
#endif
-instruct rsadd2F_reduction_reg(regF dst, vecD src2, regF tmp) %{
+instruct rsadd2F_reduction_reg(regF dst, vecD src2, vecD tmp) %{
predicate(UseSSE >= 1 && UseAVX == 0);
match(Set dst (AddReductionVF dst src2));
effect(TEMP dst, TEMP tmp);
@@ -4816,7 +5219,7 @@
ins_pipe( pipe_slow );
%}
-instruct rvadd2F_reduction_reg(regF dst, vecD src2, regF tmp) %{
+instruct rvadd2F_reduction_reg(regF dst, vecD src2, vecD tmp) %{
predicate(UseAVX > 0);
match(Set dst (AddReductionVF dst src2));
effect(TEMP dst, TEMP tmp);
@@ -4831,7 +5234,7 @@
ins_pipe( pipe_slow );
%}
-instruct rsadd4F_reduction_reg(regF dst, vecX src2, regF tmp) %{
+instruct rsadd4F_reduction_reg(regF dst, vecX src2, vecX tmp) %{
predicate(UseSSE >= 1 && UseAVX == 0);
match(Set dst (AddReductionVF dst src2));
effect(TEMP dst, TEMP tmp);
@@ -4854,7 +5257,7 @@
ins_pipe( pipe_slow );
%}
-instruct rvadd4F_reduction_reg(regF dst, vecX src2, regF tmp) %{
+instruct rvadd4F_reduction_reg(regF dst, vecX src2, vecX tmp) %{
predicate(UseAVX > 0);
match(Set dst (AddReductionVF dst src2));
effect(TEMP tmp, TEMP dst);
@@ -4877,7 +5280,7 @@
ins_pipe( pipe_slow );
%}
-instruct radd8F_reduction_reg(regF dst, vecY src2, regF tmp, regF tmp2) %{
+instruct radd8F_reduction_reg(regF dst, vecY src2, vecY tmp, vecY tmp2) %{
predicate(UseAVX > 0);
match(Set dst (AddReductionVF dst src2));
effect(TEMP tmp, TEMP dst, TEMP tmp2);
@@ -4916,7 +5319,7 @@
ins_pipe( pipe_slow );
%}
-instruct radd16F_reduction_reg(regF dst, vecZ src2, regF tmp, regF tmp2) %{
+instruct radd16F_reduction_reg(regF dst, legVecZ src2, legVecZ tmp, legVecZ tmp2) %{
predicate(UseAVX > 2);
match(Set dst (AddReductionVF dst src2));
effect(TEMP tmp, TEMP dst, TEMP tmp2);
@@ -4987,7 +5390,7 @@
ins_pipe( pipe_slow );
%}
-instruct rsadd2D_reduction_reg(regD dst, vecX src2, regD tmp) %{
+instruct rsadd2D_reduction_reg(regD dst, vecX src2, vecX tmp) %{
predicate(UseSSE >= 1 && UseAVX == 0);
match(Set dst (AddReductionVD dst src2));
effect(TEMP tmp, TEMP dst);
@@ -5002,7 +5405,7 @@
ins_pipe( pipe_slow );
%}
-instruct rvadd2D_reduction_reg(regD dst, vecX src2, regD tmp) %{
+instruct rvadd2D_reduction_reg(regD dst, vecX src2, vecX tmp) %{
predicate(UseAVX > 0);
match(Set dst (AddReductionVD dst src2));
effect(TEMP tmp, TEMP dst);
@@ -5017,14 +5420,14 @@
ins_pipe( pipe_slow );
%}
-instruct rvadd4D_reduction_reg(regD dst, vecY src2, regD tmp, regD tmp2) %{
+instruct rvadd4D_reduction_reg(regD dst, vecY src2, vecX tmp, vecX tmp2) %{
predicate(UseAVX > 0);
match(Set dst (AddReductionVD dst src2));
effect(TEMP tmp, TEMP dst, TEMP tmp2);
format %{ "vaddsd $dst,$dst,$src2\n\t"
"pshufd $tmp,$src2,0xE\n\t"
"vaddsd $dst,$dst,$tmp\n\t"
- "vextractf32x4 $tmp2,$src2,0x1\n\t"
+ "vextractf128 $tmp2,$src2,0x1\n\t"
"vaddsd $dst,$dst,$tmp2\n\t"
"pshufd $tmp,$tmp2,0xE\n\t"
"vaddsd $dst,$dst,$tmp\t! add reduction4D" %}
@@ -5032,7 +5435,7 @@
__ vaddsd($dst$$XMMRegister, $dst$$XMMRegister, $src2$$XMMRegister);
__ pshufd($tmp$$XMMRegister, $src2$$XMMRegister, 0xE);
__ vaddsd($dst$$XMMRegister, $dst$$XMMRegister, $tmp$$XMMRegister);
- __ vextractf32x4($tmp2$$XMMRegister, $src2$$XMMRegister, 0x1);
+ __ vextractf128($tmp2$$XMMRegister, $src2$$XMMRegister, 0x1);
__ vaddsd($dst$$XMMRegister, $dst$$XMMRegister, $tmp2$$XMMRegister);
__ pshufd($tmp$$XMMRegister, $tmp2$$XMMRegister, 0xE);
__ vaddsd($dst$$XMMRegister, $dst$$XMMRegister, $tmp$$XMMRegister);
@@ -5040,7 +5443,7 @@
ins_pipe( pipe_slow );
%}
-instruct rvadd8D_reduction_reg(regD dst, vecZ src2, regD tmp, regD tmp2) %{
+instruct rvadd8D_reduction_reg(regD dst, legVecZ src2, legVecZ tmp, legVecZ tmp2) %{
predicate(UseAVX > 2);
match(Set dst (AddReductionVD dst src2));
effect(TEMP tmp, TEMP dst, TEMP tmp2);
@@ -5079,7 +5482,7 @@
ins_pipe( pipe_slow );
%}
-instruct rsmul2I_reduction_reg(rRegI dst, rRegI src1, vecD src2, regF tmp, regF tmp2) %{
+instruct rsmul2I_reduction_reg(rRegI dst, rRegI src1, vecD src2, vecD tmp, vecD tmp2) %{
predicate(UseSSE > 3 && UseAVX == 0);
match(Set dst (MulReductionVI src1 src2));
effect(TEMP tmp, TEMP tmp2);
@@ -5098,7 +5501,7 @@
ins_pipe( pipe_slow );
%}
-instruct rvmul2I_reduction_reg(rRegI dst, rRegI src1, vecD src2, regF tmp, regF tmp2) %{
+instruct rvmul2I_reduction_reg(rRegI dst, rRegI src1, vecD src2, vecD tmp, vecD tmp2) %{
predicate(UseAVX > 0);
match(Set dst (MulReductionVI src1 src2));
effect(TEMP tmp, TEMP tmp2);
@@ -5118,7 +5521,7 @@
ins_pipe( pipe_slow );
%}
-instruct rsmul4I_reduction_reg(rRegI dst, rRegI src1, vecX src2, regF tmp, regF tmp2) %{
+instruct rsmul4I_reduction_reg(rRegI dst, rRegI src1, vecX src2, vecX tmp, vecX tmp2) %{
predicate(UseSSE > 3 && UseAVX == 0);
match(Set dst (MulReductionVI src1 src2));
effect(TEMP tmp, TEMP tmp2);
@@ -5141,7 +5544,7 @@
ins_pipe( pipe_slow );
%}
-instruct rvmul4I_reduction_reg(rRegI dst, rRegI src1, vecX src2, regF tmp, regF tmp2) %{
+instruct rvmul4I_reduction_reg(rRegI dst, rRegI src1, vecX src2, vecX tmp, vecX tmp2) %{
predicate(UseAVX > 0);
match(Set dst (MulReductionVI src1 src2));
effect(TEMP tmp, TEMP tmp2);
@@ -5165,8 +5568,8 @@
ins_pipe( pipe_slow );
%}
-instruct rvmul8I_reduction_reg(rRegI dst, rRegI src1, vecY src2, regF tmp, regF tmp2) %{
- predicate(UseAVX > 0);
+instruct rvmul8I_reduction_reg(rRegI dst, rRegI src1, vecY src2, vecY tmp, vecY tmp2) %{
+ predicate(UseAVX > 1);
match(Set dst (MulReductionVI src1 src2));
effect(TEMP tmp, TEMP tmp2);
format %{ "vextracti128_high $tmp,$src2\n\t"
@@ -5193,7 +5596,7 @@
ins_pipe( pipe_slow );
%}
-instruct rvmul16I_reduction_reg(rRegI dst, rRegI src1, vecZ src2, regF tmp, regF tmp2, regF tmp3) %{
+instruct rvmul16I_reduction_reg(rRegI dst, rRegI src1, legVecZ src2, legVecZ tmp, legVecZ tmp2, legVecZ tmp3) %{
predicate(UseAVX > 2);
match(Set dst (MulReductionVI src1 src2));
effect(TEMP tmp, TEMP tmp2, TEMP tmp3);
@@ -5225,7 +5628,7 @@
%}
#ifdef _LP64
-instruct rvmul2L_reduction_reg(rRegL dst, rRegL src1, vecX src2, regF tmp, regF tmp2) %{
+instruct rvmul2L_reduction_reg(rRegL dst, rRegL src1, vecX src2, vecX tmp, vecX tmp2) %{
predicate(UseAVX > 2 && VM_Version::supports_avx512dq());
match(Set dst (MulReductionVL src1 src2));
effect(TEMP tmp, TEMP tmp2);
@@ -5244,7 +5647,7 @@
ins_pipe( pipe_slow );
%}
-instruct rvmul4L_reduction_reg(rRegL dst, rRegL src1, vecY src2, regF tmp, regF tmp2) %{
+instruct rvmul4L_reduction_reg(rRegL dst, rRegL src1, vecY src2, vecY tmp, vecY tmp2) %{
predicate(UseAVX > 2 && VM_Version::supports_avx512dq());
match(Set dst (MulReductionVL src1 src2));
effect(TEMP tmp, TEMP tmp2);
@@ -5267,7 +5670,7 @@
ins_pipe( pipe_slow );
%}
-instruct rvmul8L_reduction_reg(rRegL dst, rRegL src1, vecZ src2, regF tmp, regF tmp2) %{
+instruct rvmul8L_reduction_reg(rRegL dst, rRegL src1, legVecZ src2, legVecZ tmp, legVecZ tmp2) %{
predicate(UseAVX > 2 && VM_Version::supports_avx512dq());
match(Set dst (MulReductionVL src1 src2));
effect(TEMP tmp, TEMP tmp2);
@@ -5295,7 +5698,7 @@
%}
#endif
-instruct rsmul2F_reduction(regF dst, vecD src2, regF tmp) %{
+instruct rsmul2F_reduction(regF dst, vecD src2, vecD tmp) %{
predicate(UseSSE >= 1 && UseAVX == 0);
match(Set dst (MulReductionVF dst src2));
effect(TEMP dst, TEMP tmp);
@@ -5310,7 +5713,7 @@
ins_pipe( pipe_slow );
%}
-instruct rvmul2F_reduction_reg(regF dst, vecD src2, regF tmp) %{
+instruct rvmul2F_reduction_reg(regF dst, vecD src2, vecD tmp) %{
predicate(UseAVX > 0);
match(Set dst (MulReductionVF dst src2));
effect(TEMP tmp, TEMP dst);
@@ -5325,7 +5728,7 @@
ins_pipe( pipe_slow );
%}
-instruct rsmul4F_reduction_reg(regF dst, vecX src2, regF tmp) %{
+instruct rsmul4F_reduction_reg(regF dst, vecX src2, vecX tmp) %{
predicate(UseSSE >= 1 && UseAVX == 0);
match(Set dst (MulReductionVF dst src2));
effect(TEMP dst, TEMP tmp);
@@ -5348,7 +5751,7 @@
ins_pipe( pipe_slow );
%}
-instruct rvmul4F_reduction_reg(regF dst, vecX src2, regF tmp) %{
+instruct rvmul4F_reduction_reg(regF dst, vecX src2, vecX tmp) %{
predicate(UseAVX > 0);
match(Set dst (MulReductionVF dst src2));
effect(TEMP tmp, TEMP dst);
@@ -5371,7 +5774,7 @@
ins_pipe( pipe_slow );
%}
-instruct rvmul8F_reduction_reg(regF dst, vecY src2, regF tmp, regF tmp2) %{
+instruct rvmul8F_reduction_reg(regF dst, vecY src2, vecY tmp, vecY tmp2) %{
predicate(UseAVX > 0);
match(Set dst (MulReductionVF dst src2));
effect(TEMP tmp, TEMP dst, TEMP tmp2);
@@ -5410,7 +5813,7 @@
ins_pipe( pipe_slow );
%}
-instruct rvmul16F_reduction_reg(regF dst, vecZ src2, regF tmp, regF tmp2) %{
+instruct rvmul16F_reduction_reg(regF dst, legVecZ src2, legVecZ tmp, legVecZ tmp2) %{
predicate(UseAVX > 2);
match(Set dst (MulReductionVF dst src2));
effect(TEMP tmp, TEMP dst, TEMP tmp2);
@@ -5481,7 +5884,7 @@
ins_pipe( pipe_slow );
%}
-instruct rsmul2D_reduction_reg(regD dst, vecX src2, regD tmp) %{
+instruct rsmul2D_reduction_reg(regD dst, vecX src2, vecX tmp) %{
predicate(UseSSE >= 1 && UseAVX == 0);
match(Set dst (MulReductionVD dst src2));
effect(TEMP dst, TEMP tmp);
@@ -5496,7 +5899,7 @@
ins_pipe( pipe_slow );
%}
-instruct rvmul2D_reduction_reg(regD dst, vecX src2, regD tmp) %{
+instruct rvmul2D_reduction_reg(regD dst, vecX src2, vecX tmp) %{
predicate(UseAVX > 0);
match(Set dst (MulReductionVD dst src2));
effect(TEMP tmp, TEMP dst);
@@ -5511,7 +5914,7 @@
ins_pipe( pipe_slow );
%}
-instruct rvmul4D_reduction_reg(regD dst, vecY src2, regD tmp, regD tmp2) %{
+instruct rvmul4D_reduction_reg(regD dst, vecY src2, vecY tmp, vecY tmp2) %{
predicate(UseAVX > 0);
match(Set dst (MulReductionVD dst src2));
effect(TEMP tmp, TEMP dst, TEMP tmp2);
@@ -5534,7 +5937,7 @@
ins_pipe( pipe_slow );
%}
-instruct rvmul8D_reduction_reg(regD dst, vecZ src2, regD tmp, regD tmp2) %{
+instruct rvmul8D_reduction_reg(regD dst, legVecZ src2, legVecZ tmp, legVecZ tmp2) %{
predicate(UseAVX > 2);
match(Set dst (MulReductionVD dst src2));
effect(TEMP tmp, TEMP dst, TEMP tmp2);
@@ -5588,19 +5991,8 @@
ins_pipe( pipe_slow );
%}
-instruct vadd4B_reg_avx(vecS dst, vecS src1, vecS src2) %{
- predicate(VM_Version::supports_avxonly() && n->as_Vector()->length() == 4);
- match(Set dst (AddVB src1 src2));
- format %{ "vpaddb $dst,$src1,$src2\t! add packed4B" %}
- ins_encode %{
- int vector_len = 0;
- __ vpaddb($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
-instruct vadd4B_reg_evex(vecS dst, vecS src1, vecS src2) %{
- predicate(VM_Version::supports_avx512bw() && n->as_Vector()->length() == 4);
+instruct vadd4B_reg(vecS dst, vecS src1, vecS src2) %{
+ predicate(UseAVX > 0 && n->as_Vector()->length() == 4);
match(Set dst (AddVB src1 src2));
format %{ "vpaddb $dst,$src1,$src2\t! add packed4B" %}
ins_encode %{
@@ -5610,20 +6002,9 @@
ins_pipe( pipe_slow );
%}
-instruct vadd4B_reg_evex_special(vecS dst, vecS src1, vecS src2) %{
- predicate(VM_Version::supports_avx512nobw() && n->as_Vector()->length() == 4);
- match(Set dst (AddVB dst src2));
- effect(TEMP src1);
- format %{ "vpaddb $dst,$dst,$src2\t! add packed4B" %}
- ins_encode %{
- int vector_len = 0;
- __ vpaddb($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
-instruct vadd4B_mem_avx(vecS dst, vecS src, memory mem) %{
- predicate(VM_Version::supports_avxonly() && n->as_Vector()->length() == 4);
+
+instruct vadd4B_mem(vecS dst, vecS src, memory mem) %{
+ predicate(UseAVX > 0 && n->as_Vector()->length() == 4);
match(Set dst (AddVB src (LoadVector mem)));
format %{ "vpaddb $dst,$src,$mem\t! add packed4B" %}
ins_encode %{
@@ -5633,29 +6014,6 @@
ins_pipe( pipe_slow );
%}
-instruct vadd4B_mem_evex(vecS dst, vecS src, memory mem) %{
- predicate(VM_Version::supports_avx512bw() && n->as_Vector()->length() == 4);
- match(Set dst (AddVB src (LoadVector mem)));
- format %{ "vpaddb $dst,$src,$mem\t! add packed4B" %}
- ins_encode %{
- int vector_len = 0;
- __ vpaddb($dst$$XMMRegister, $src$$XMMRegister, $mem$$Address, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
-instruct vadd4B_mem_evex_special(vecS dst, vecS src, memory mem) %{
- predicate(VM_Version::supports_avx512nobw() && n->as_Vector()->length() == 4);
- match(Set dst (AddVB dst (LoadVector mem)));
- effect(TEMP src);
- format %{ "vpaddb $dst,$src,$mem\t! add packed4B" %}
- ins_encode %{
- int vector_len = 0;
- __ vpaddb($dst$$XMMRegister, $src$$XMMRegister, $mem$$Address, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
instruct vadd8B(vecD dst, vecD src) %{
predicate(UseAVX == 0 && n->as_Vector()->length() == 8);
match(Set dst (AddVB dst src));
@@ -5666,19 +6024,8 @@
ins_pipe( pipe_slow );
%}
-instruct vadd8B_reg_avx(vecD dst, vecD src1, vecD src2) %{
- predicate(VM_Version::supports_avxonly() && n->as_Vector()->length() == 8);
- match(Set dst (AddVB src1 src2));
- format %{ "vpaddb $dst,$src1,$src2\t! add packed8B" %}
- ins_encode %{
- int vector_len = 0;
- __ vpaddb($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
-instruct vadd8B_reg_evex(vecD dst, vecD src1, vecD src2) %{
- predicate(VM_Version::supports_avx512bw() && n->as_Vector()->length() == 8);
+instruct vadd8B_reg(vecD dst, vecD src1, vecD src2) %{
+ predicate(UseAVX > 0 && n->as_Vector()->length() == 8);
match(Set dst (AddVB src1 src2));
format %{ "vpaddb $dst,$src1,$src2\t! add packed8B" %}
ins_encode %{
@@ -5688,20 +6035,9 @@
ins_pipe( pipe_slow );
%}
-instruct vadd8B_reg_evex_special(vecD dst, vecD src1, vecD src2) %{
- predicate(VM_Version::supports_avx512nobw() && n->as_Vector()->length() == 8);
- match(Set dst (AddVB dst src2));
- effect(TEMP src1);
- format %{ "vpaddb $dst,$dst,$src2\t! add packed8B" %}
- ins_encode %{
- int vector_len = 0;
- __ vpaddb($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
-instruct vadd8B_mem_avx(vecD dst, vecD src, memory mem) %{
- predicate(VM_Version::supports_avxonly() && n->as_Vector()->length() == 8);
+
+instruct vadd8B_mem(vecD dst, vecD src, memory mem) %{
+ predicate(UseAVX > 0 && n->as_Vector()->length() == 8);
match(Set dst (AddVB src (LoadVector mem)));
format %{ "vpaddb $dst,$src,$mem\t! add packed8B" %}
ins_encode %{
@@ -5711,29 +6047,6 @@
ins_pipe( pipe_slow );
%}
-instruct vadd8B_mem_evex(vecD dst, vecD src, memory mem) %{
- predicate(VM_Version::supports_avx512bw() && n->as_Vector()->length() == 8);
- match(Set dst (AddVB src (LoadVector mem)));
- format %{ "vpaddb $dst,$src,$mem\t! add packed8B" %}
- ins_encode %{
- int vector_len = 0;
- __ vpaddb($dst$$XMMRegister, $src$$XMMRegister, $mem$$Address, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
-instruct vadd8B_mem_evex_special(vecD dst, vecD src, memory mem) %{
- predicate(VM_Version::supports_avx512nobw() && n->as_Vector()->length() == 8);
- match(Set dst (AddVB dst (LoadVector mem)));
- effect(TEMP src);
- format %{ "vpaddb $dst,$src,$mem\t! add packed8B" %}
- ins_encode %{
- int vector_len = 0;
- __ vpaddb($dst$$XMMRegister, $src$$XMMRegister, $mem$$Address, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
instruct vadd16B(vecX dst, vecX src) %{
predicate(UseAVX == 0 && n->as_Vector()->length() == 16);
match(Set dst (AddVB dst src));
@@ -5744,19 +6057,8 @@
ins_pipe( pipe_slow );
%}
-instruct vadd16B_reg_avx(vecX dst, vecX src1, vecX src2) %{
- predicate(VM_Version::supports_avxonly() && n->as_Vector()->length() == 16);
- match(Set dst (AddVB src1 src2));
- format %{ "vpaddb $dst,$src1,$src2\t! add packed16B" %}
- ins_encode %{
- int vector_len = 0;
- __ vpaddb($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
-instruct vadd16B_reg_evex(vecX dst, vecX src1, vecX src2) %{
- predicate(VM_Version::supports_avx512bw() && n->as_Vector()->length() == 16);
+instruct vadd16B_reg(vecX dst, vecX src1, vecX src2) %{
+ predicate(UseAVX > 0 && n->as_Vector()->length() == 16);
match(Set dst (AddVB src1 src2));
format %{ "vpaddb $dst,$src1,$src2\t! add packed16B" %}
ins_encode %{
@@ -5766,31 +6068,8 @@
ins_pipe( pipe_slow );
%}
-instruct vadd16B_reg_evex_special(vecX dst, vecX src1, vecX src2) %{
- predicate(VM_Version::supports_avx512nobw() && n->as_Vector()->length() == 16);
- match(Set dst (AddVB dst src2));
- effect(TEMP src1);
- format %{ "vpaddb $dst,$dst,$src2\t! add packed16B" %}
- ins_encode %{
- int vector_len = 0;
- __ vpaddb($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
-instruct vadd16B_mem_avx(vecX dst, vecX src, memory mem) %{
- predicate(VM_Version::supports_avxonly() && n->as_Vector()->length() == 16);
- match(Set dst (AddVB src (LoadVector mem)));
- format %{ "vpaddb $dst,$src,$mem\t! add packed16B" %}
- ins_encode %{
- int vector_len = 0;
- __ vpaddb($dst$$XMMRegister, $src$$XMMRegister, $mem$$Address, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
-instruct vadd16B_mem_evex(vecX dst, vecX src, memory mem) %{
- predicate(VM_Version::supports_avx512bw() && n->as_Vector()->length() == 16);
+instruct vadd16B_mem(vecX dst, vecX src, memory mem) %{
+ predicate(UseAVX > 0 && n->as_Vector()->length() == 16);
match(Set dst (AddVB src (LoadVector mem)));
format %{ "vpaddb $dst,$src,$mem\t! add packed16B" %}
ins_encode %{
@@ -5800,31 +6079,8 @@
ins_pipe( pipe_slow );
%}
-instruct vadd16B_mem_evex_special(vecX dst, vecX src, memory mem) %{
- predicate(VM_Version::supports_avx512nobw() && n->as_Vector()->length() == 16);
- match(Set dst (AddVB dst (LoadVector mem)));
- effect(TEMP src);
- format %{ "vpaddb $dst,$src,$mem\t! add packed16B" %}
- ins_encode %{
- int vector_len = 0;
- __ vpaddb($dst$$XMMRegister, $src$$XMMRegister, $mem$$Address, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
-instruct vadd32B_reg_avx(vecY dst, vecY src1, vecY src2) %{
- predicate(VM_Version::supports_avx256only() && n->as_Vector()->length() == 32);
- match(Set dst (AddVB src1 src2));
- format %{ "vpaddb $dst,$src1,$src2\t! add packed32B" %}
- ins_encode %{
- int vector_len = 1;
- __ vpaddb($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
-instruct vadd32B_reg_evex(vecY dst, vecY src1, vecY src2) %{
- predicate(VM_Version::supports_avx512bw() && n->as_Vector()->length() == 32);
+instruct vadd32B_reg(vecY dst, vecY src1, vecY src2) %{
+ predicate(UseAVX > 1 && n->as_Vector()->length() == 32);
match(Set dst (AddVB src1 src2));
format %{ "vpaddb $dst,$src1,$src2\t! add packed32B" %}
ins_encode %{
@@ -5834,20 +6090,8 @@
ins_pipe( pipe_slow );
%}
-instruct vadd32B_reg_evex_special(vecY dst, vecY src1, vecY src2) %{
- predicate(VM_Version::supports_avx512nobw() && n->as_Vector()->length() == 32);
- match(Set dst (AddVB dst src2));
- effect(TEMP src1);
- format %{ "vpaddb $dst,$dst,$src2\t! add packed32B" %}
- ins_encode %{
- int vector_len = 1;
- __ vpaddb($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
-instruct vadd32B_mem_avx(vecY dst, vecY src, memory mem) %{
- predicate(VM_Version::supports_avx256only() && n->as_Vector()->length() == 32);
+instruct vadd32B_mem(vecY dst, vecY src, memory mem) %{
+ predicate(UseAVX > 1 && n->as_Vector()->length() == 32);
match(Set dst (AddVB src (LoadVector mem)));
format %{ "vpaddb $dst,$src,$mem\t! add packed32B" %}
ins_encode %{
@@ -5857,31 +6101,8 @@
ins_pipe( pipe_slow );
%}
-instruct vadd32B_mem_evex(vecY dst, vecY src, memory mem) %{
- predicate(VM_Version::supports_avx512bw() && n->as_Vector()->length() == 32);
- match(Set dst (AddVB src (LoadVector mem)));
- format %{ "vpaddb $dst,$src,$mem\t! add packed32B" %}
- ins_encode %{
- int vector_len = 1;
- __ vpaddb($dst$$XMMRegister, $src$$XMMRegister, $mem$$Address, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
-instruct vadd32B_mem_evex_special(vecY dst, vecY src, memory mem) %{
- predicate(VM_Version::supports_avx512nobw() && n->as_Vector()->length() == 32);
- match(Set dst (AddVB dst (LoadVector mem)));
- effect(TEMP src);
- format %{ "vpaddb $dst,$src,$mem\t! add packed32B" %}
- ins_encode %{
- int vector_len = 1;
- __ vpaddb($dst$$XMMRegister, $src$$XMMRegister, $mem$$Address, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
instruct vadd64B_reg(vecZ dst, vecZ src1, vecZ src2) %{
- predicate(VM_Version::supports_avx512bw() && n->as_Vector()->length() == 64);
+ predicate(UseAVX > 2 && VM_Version::supports_avx512bw() && n->as_Vector()->length() == 64);
match(Set dst (AddVB src1 src2));
format %{ "vpaddb $dst,$src1,$src2\t! add packed64B" %}
ins_encode %{
@@ -5892,7 +6113,7 @@
%}
instruct vadd64B_mem(vecZ dst, vecZ src, memory mem) %{
- predicate(VM_Version::supports_avx512bw() && n->as_Vector()->length() == 64);
+ predicate(UseAVX > 2 && VM_Version::supports_avx512bw() && n->as_Vector()->length() == 64);
match(Set dst (AddVB src (LoadVector mem)));
format %{ "vpaddb $dst,$src,$mem\t! add packed64B" %}
ins_encode %{
@@ -5913,19 +6134,8 @@
ins_pipe( pipe_slow );
%}
-instruct vadd2S_reg_avx(vecS dst, vecS src1, vecS src2) %{
- predicate(VM_Version::supports_avxonly() && n->as_Vector()->length() == 2);
- match(Set dst (AddVS src1 src2));
- format %{ "vpaddw $dst,$src1,$src2\t! add packed2S" %}
- ins_encode %{
- int vector_len = 0;
- __ vpaddw($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
-instruct vadd2S_reg_evex(vecS dst, vecS src1, vecS src2) %{
- predicate(VM_Version::supports_avx512bw() && n->as_Vector()->length() == 2);
+instruct vadd2S_reg(vecS dst, vecS src1, vecS src2) %{
+ predicate(UseAVX > 0 && n->as_Vector()->length() == 2);
match(Set dst (AddVS src1 src2));
format %{ "vpaddw $dst,$src1,$src2\t! add packed2S" %}
ins_encode %{
@@ -5935,20 +6145,8 @@
ins_pipe( pipe_slow );
%}
-instruct vadd2S_reg_evex_special(vecS dst, vecS src1, vecS src2) %{
- predicate(VM_Version::supports_avx512nobw() && n->as_Vector()->length() == 2);
- match(Set dst (AddVS dst src2));
- effect(TEMP src1);
- format %{ "vpaddw $dst,$dst,$src2\t! add packed2S" %}
- ins_encode %{
- int vector_len = 0;
- __ vpaddw($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
-instruct vadd2S_mem_avx(vecS dst, vecS src, memory mem) %{
- predicate(VM_Version::supports_avxonly() && n->as_Vector()->length() == 2);
+instruct vadd2S_mem(vecS dst, vecS src, memory mem) %{
+ predicate(UseAVX > 0 && n->as_Vector()->length() == 2);
match(Set dst (AddVS src (LoadVector mem)));
format %{ "vpaddw $dst,$src,$mem\t! add packed2S" %}
ins_encode %{
@@ -5958,29 +6156,6 @@
ins_pipe( pipe_slow );
%}
-instruct vadd2S_mem_evex(vecS dst, vecS src, memory mem) %{
- predicate(VM_Version::supports_avx512bw() && n->as_Vector()->length() == 2);
- match(Set dst (AddVS src (LoadVector mem)));
- format %{ "vpaddw $dst,$src,$mem\t! add packed2S" %}
- ins_encode %{
- int vector_len = 0;
- __ vpaddw($dst$$XMMRegister, $src$$XMMRegister, $mem$$Address, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
-instruct vadd2S_mem_evex_special(vecS dst, vecS src, memory mem) %{
- predicate(VM_Version::supports_avx512nobw() && n->as_Vector()->length() == 2);
- match(Set dst (AddVS dst (LoadVector mem)));
- effect(TEMP src);
- format %{ "vpaddw $dst,$src,$mem\t! add packed2S" %}
- ins_encode %{
- int vector_len = 0;
- __ vpaddw($dst$$XMMRegister, $src$$XMMRegister, $mem$$Address, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
instruct vadd4S(vecD dst, vecD src) %{
predicate(UseAVX == 0 && n->as_Vector()->length() == 4);
match(Set dst (AddVS dst src));
@@ -5991,19 +6166,8 @@
ins_pipe( pipe_slow );
%}
-instruct vadd4S_reg_avx(vecD dst, vecD src1, vecD src2) %{
- predicate(VM_Version::supports_avxonly() && n->as_Vector()->length() == 4);
- match(Set dst (AddVS src1 src2));
- format %{ "vpaddw $dst,$src1,$src2\t! add packed4S" %}
- ins_encode %{
- int vector_len = 0;
- __ vpaddw($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
-instruct vadd4S_reg_evex(vecD dst, vecD src1, vecD src2) %{
- predicate(VM_Version::supports_avx512bw() && n->as_Vector()->length() == 4);
+instruct vadd4S_reg(vecD dst, vecD src1, vecD src2) %{
+ predicate(UseAVX > 0 && n->as_Vector()->length() == 4);
match(Set dst (AddVS src1 src2));
format %{ "vpaddw $dst,$src1,$src2\t! add packed4S" %}
ins_encode %{
@@ -6013,20 +6177,8 @@
ins_pipe( pipe_slow );
%}
-instruct vadd4S_reg_evex_special(vecD dst, vecD src1, vecD src2) %{
- predicate(VM_Version::supports_avx512nobw() && n->as_Vector()->length() == 4);
- match(Set dst (AddVS dst src2));
- effect(TEMP src1);
- format %{ "vpaddw $dst,$dst,$src2\t! add packed4S" %}
- ins_encode %{
- int vector_len = 0;
- __ vpaddw($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
-instruct vadd4S_mem_avx(vecD dst, vecD src, memory mem) %{
- predicate(VM_Version::supports_avxonly() && n->as_Vector()->length() == 4);
+instruct vadd4S_mem(vecD dst, vecD src, memory mem) %{
+ predicate(UseAVX > 0 && n->as_Vector()->length() == 4);
match(Set dst (AddVS src (LoadVector mem)));
format %{ "vpaddw $dst,$src,$mem\t! add packed4S" %}
ins_encode %{
@@ -6036,29 +6188,6 @@
ins_pipe( pipe_slow );
%}
-instruct vadd4S_mem_evex(vecD dst, vecD src, memory mem) %{
- predicate(VM_Version::supports_avx512bw() && n->as_Vector()->length() == 4);
- match(Set dst (AddVS src (LoadVector mem)));
- format %{ "vpaddw $dst,$src,$mem\t! add packed4S" %}
- ins_encode %{
- int vector_len = 0;
- __ vpaddw($dst$$XMMRegister, $src$$XMMRegister, $mem$$Address, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
-instruct vadd4S_mem_evex_special(vecD dst, vecD src, memory mem) %{
- predicate(VM_Version::supports_avx512nobw() && n->as_Vector()->length() == 4);
- match(Set dst (AddVS dst (LoadVector mem)));
- effect(TEMP src);
- format %{ "vpaddw $dst,$src,$mem\t! add packed4S" %}
- ins_encode %{
- int vector_len = 0;
- __ vpaddw($dst$$XMMRegister, $src$$XMMRegister, $mem$$Address, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
instruct vadd8S(vecX dst, vecX src) %{
predicate(UseAVX == 0 && n->as_Vector()->length() == 8);
match(Set dst (AddVS dst src));
@@ -6069,19 +6198,8 @@
ins_pipe( pipe_slow );
%}
-instruct vadd8S_reg_avx(vecX dst, vecX src1, vecX src2) %{
- predicate(VM_Version::supports_avxonly() && n->as_Vector()->length() == 8);
- match(Set dst (AddVS src1 src2));
- format %{ "vpaddw $dst,$src1,$src2\t! add packed8S" %}
- ins_encode %{
- int vector_len = 0;
- __ vpaddw($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
-instruct vadd8S_reg_evex(vecX dst, vecX src1, vecX src2) %{
- predicate(VM_Version::supports_avx512bw() && n->as_Vector()->length() == 8);
+instruct vadd8S_reg(vecX dst, vecX src1, vecX src2) %{
+ predicate(UseAVX > 0 && n->as_Vector()->length() == 8);
match(Set dst (AddVS src1 src2));
format %{ "vpaddw $dst,$src1,$src2\t! add packed8S" %}
ins_encode %{
@@ -6091,31 +6209,8 @@
ins_pipe( pipe_slow );
%}
-instruct vadd8S_reg_evex_special(vecX dst, vecX src1, vecX src2) %{
- predicate(VM_Version::supports_avx512nobw() && n->as_Vector()->length() == 8);
- match(Set dst (AddVS dst src2));
- effect(TEMP src1);
- format %{ "vpaddw $dst,$dst,$src2\t! add packed8S" %}
- ins_encode %{
- int vector_len = 0;
- __ vpaddw($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
-instruct vadd8S_mem_avx(vecX dst, vecX src, memory mem) %{
- predicate(VM_Version::supports_avxonly() && n->as_Vector()->length() == 8);
- match(Set dst (AddVS src (LoadVector mem)));
- format %{ "vpaddw $dst,$src,$mem\t! add packed8S" %}
- ins_encode %{
- int vector_len = 0;
- __ vpaddw($dst$$XMMRegister, $src$$XMMRegister, $mem$$Address, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
-instruct vadd8S_mem_evex(vecX dst, vecX src, memory mem) %{
- predicate(VM_Version::supports_avx512bw() && n->as_Vector()->length() == 8);
+instruct vadd8S_mem(vecX dst, vecX src, memory mem) %{
+ predicate(UseAVX > 0 && n->as_Vector()->length() == 8);
match(Set dst (AddVS src (LoadVector mem)));
format %{ "vpaddw $dst,$src,$mem\t! add packed8S" %}
ins_encode %{
@@ -6125,31 +6220,8 @@
ins_pipe( pipe_slow );
%}
-instruct vadd8S_mem_evex_special(vecX dst, vecX src, memory mem) %{
- predicate(VM_Version::supports_avx512nobw() && n->as_Vector()->length() == 8);
- match(Set dst (AddVS dst (LoadVector mem)));
- effect(TEMP src);
- format %{ "vpaddw $dst,$src,$mem\t! add packed8S" %}
- ins_encode %{
- int vector_len = 0;
- __ vpaddw($dst$$XMMRegister, $src$$XMMRegister, $mem$$Address, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
-instruct vadd16S_reg_avx(vecY dst, vecY src1, vecY src2) %{
- predicate(VM_Version::supports_avx256only() && n->as_Vector()->length() == 16);
- match(Set dst (AddVS src1 src2));
- format %{ "vpaddw $dst,$src1,$src2\t! add packed16S" %}
- ins_encode %{
- int vector_len = 1;
- __ vpaddw($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
-instruct vadd16S_reg_evex(vecY dst, vecY src1, vecY src2) %{
- predicate(VM_Version::supports_avx512bw() && n->as_Vector()->length() == 16);
+instruct vadd16S_reg(vecY dst, vecY src1, vecY src2) %{
+ predicate(UseAVX > 1 && n->as_Vector()->length() == 16);
match(Set dst (AddVS src1 src2));
format %{ "vpaddw $dst,$src1,$src2\t! add packed16S" %}
ins_encode %{
@@ -6159,20 +6231,8 @@
ins_pipe( pipe_slow );
%}
-instruct vadd16S_reg_evex_special(vecY dst, vecY src1, vecY src2) %{
- predicate(VM_Version::supports_avx512nobw() && n->as_Vector()->length() == 16);
- match(Set dst (AddVS dst src2));
- effect(TEMP src1);
- format %{ "vpaddw $dst,$dst,$src2\t! add packed16S" %}
- ins_encode %{
- int vector_len = 1;
- __ vpaddw($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
-instruct vadd16S_mem_avx(vecY dst, vecY src, memory mem) %{
- predicate(VM_Version::supports_avx256only() && n->as_Vector()->length() == 16);
+instruct vadd16S_mem(vecY dst, vecY src, memory mem) %{
+ predicate(UseAVX > 1 && n->as_Vector()->length() == 16);
match(Set dst (AddVS src (LoadVector mem)));
format %{ "vpaddw $dst,$src,$mem\t! add packed16S" %}
ins_encode %{
@@ -6182,31 +6242,8 @@
ins_pipe( pipe_slow );
%}
-instruct vadd16S_mem_evex(vecY dst, vecY src, memory mem) %{
- predicate(VM_Version::supports_avx512bw() && n->as_Vector()->length() == 16);
- match(Set dst (AddVS src (LoadVector mem)));
- format %{ "vpaddw $dst,$src,$mem\t! add packed16S" %}
- ins_encode %{
- int vector_len = 1;
- __ vpaddw($dst$$XMMRegister, $src$$XMMRegister, $mem$$Address, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
-instruct vadd16S_mem_evex_special(vecY dst, vecY src, memory mem) %{
- predicate(VM_Version::supports_avx512nobw() && n->as_Vector()->length() == 16);
- match(Set dst (AddVS dst (LoadVector mem)));
- effect(TEMP src);
- format %{ "vpaddw $dst,$src,$mem\t! add packed16S" %}
- ins_encode %{
- int vector_len = 1;
- __ vpaddw($dst$$XMMRegister, $src$$XMMRegister, $mem$$Address, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
instruct vadd32S_reg(vecZ dst, vecZ src1, vecZ src2) %{
- predicate(VM_Version::supports_avx512bw() && n->as_Vector()->length() == 32);
+ predicate(UseAVX > 2 && VM_Version::supports_avx512bw() && n->as_Vector()->length() == 32);
match(Set dst (AddVS src1 src2));
format %{ "vpaddw $dst,$src1,$src2\t! add packed32S" %}
ins_encode %{
@@ -6217,7 +6254,7 @@
%}
instruct vadd32S_mem(vecZ dst, vecZ src, memory mem) %{
- predicate(VM_Version::supports_avx512bw() && n->as_Vector()->length() == 32);
+ predicate(UseAVX > 2 && VM_Version::supports_avx512bw() && n->as_Vector()->length() == 32);
match(Set dst (AddVS src (LoadVector mem)));
format %{ "vpaddw $dst,$src,$mem\t! add packed32S" %}
ins_encode %{
@@ -6229,7 +6266,7 @@
// Integers vector add
instruct vadd2I(vecD dst, vecD src) %{
- predicate(n->as_Vector()->length() == 2);
+ predicate(UseAVX == 0 && n->as_Vector()->length() == 2);
match(Set dst (AddVI dst src));
format %{ "paddd $dst,$src\t! add packed2I" %}
ins_encode %{
@@ -6261,7 +6298,7 @@
%}
instruct vadd4I(vecX dst, vecX src) %{
- predicate(n->as_Vector()->length() == 4);
+ predicate(UseAVX == 0 && n->as_Vector()->length() == 4);
match(Set dst (AddVI dst src));
format %{ "paddd $dst,$src\t! add packed4I" %}
ins_encode %{
@@ -6338,7 +6375,7 @@
// Longs vector add
instruct vadd2L(vecX dst, vecX src) %{
- predicate(n->as_Vector()->length() == 2);
+ predicate(UseAVX == 0 && n->as_Vector()->length() == 2);
match(Set dst (AddVL dst src));
format %{ "paddq $dst,$src\t! add packed2L" %}
ins_encode %{
@@ -6415,7 +6452,7 @@
// Floats vector add
instruct vadd2F(vecD dst, vecD src) %{
- predicate(n->as_Vector()->length() == 2);
+ predicate(UseAVX == 0 && n->as_Vector()->length() == 2);
match(Set dst (AddVF dst src));
format %{ "addps $dst,$src\t! add packed2F" %}
ins_encode %{
@@ -6447,7 +6484,7 @@
%}
instruct vadd4F(vecX dst, vecX src) %{
- predicate(n->as_Vector()->length() == 4);
+ predicate(UseAVX == 0 && n->as_Vector()->length() == 4);
match(Set dst (AddVF dst src));
format %{ "addps $dst,$src\t! add packed4F" %}
ins_encode %{
@@ -6524,7 +6561,7 @@
// Doubles vector add
instruct vadd2D(vecX dst, vecX src) %{
- predicate(n->as_Vector()->length() == 2);
+ predicate(UseAVX == 0 && n->as_Vector()->length() == 2);
match(Set dst (AddVD dst src));
format %{ "addpd $dst,$src\t! add packed2D" %}
ins_encode %{
@@ -6612,19 +6649,8 @@
ins_pipe( pipe_slow );
%}
-instruct vsub4B_reg_avx(vecS dst, vecS src1, vecS src2) %{
- predicate(VM_Version::supports_avxonly() && n->as_Vector()->length() == 4);
- match(Set dst (SubVB src1 src2));
- format %{ "vpsubb $dst,$src1,$src2\t! sub packed4B" %}
- ins_encode %{
- int vector_len = 0;
- __ vpsubb($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
-instruct vsub4B_reg_evex(vecS dst, vecS src1, vecS src2) %{
- predicate(VM_Version::supports_avx512bw() && n->as_Vector()->length() == 4);
+instruct vsub4B_reg(vecS dst, vecS src1, vecS src2) %{
+ predicate(UseAVX > 0 && n->as_Vector()->length() == 4);
match(Set dst (SubVB src1 src2));
format %{ "vpsubb $dst,$src1,$src2\t! sub packed4B" %}
ins_encode %{
@@ -6634,20 +6660,8 @@
ins_pipe( pipe_slow );
%}
-instruct vsub4B_reg_exex_special(vecS dst, vecS src1, vecS src2) %{
- predicate(VM_Version::supports_avx512nobw() && n->as_Vector()->length() == 4);
- match(Set dst (SubVB dst src2));
- effect(TEMP src1);
- format %{ "vpsubb $dst,$src1,$src2\t! sub packed4B" %}
- ins_encode %{
- int vector_len = 0;
- __ vpsubb($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
-instruct vsub4B_mem_avx(vecS dst, vecS src, memory mem) %{
- predicate(VM_Version::supports_avxonly() && n->as_Vector()->length() == 4);
+instruct vsub4B_mem(vecS dst, vecS src, memory mem) %{
+ predicate(UseAVX > 0 && n->as_Vector()->length() == 4);
match(Set dst (SubVB src (LoadVector mem)));
format %{ "vpsubb $dst,$src,$mem\t! sub packed4B" %}
ins_encode %{
@@ -6657,29 +6671,6 @@
ins_pipe( pipe_slow );
%}
-instruct vsub4B_mem_evex(vecS dst, vecS src, memory mem) %{
- predicate(VM_Version::supports_avx512bw() && n->as_Vector()->length() == 4);
- match(Set dst (SubVB src (LoadVector mem)));
- format %{ "vpsubb $dst,$src,$mem\t! sub packed4B" %}
- ins_encode %{
- int vector_len = 0;
- __ vpsubb($dst$$XMMRegister, $src$$XMMRegister, $mem$$Address, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
-instruct vsub4B_mem_evex_special(vecS dst, vecS src, memory mem) %{
- predicate(VM_Version::supports_avx512nobw() && n->as_Vector()->length() == 4);
- match(Set dst (SubVB dst (LoadVector mem)));
- effect(TEMP src);
- format %{ "vpsubb $dst,$src,$mem\t! sub packed4B" %}
- ins_encode %{
- int vector_len = 0;
- __ vpsubb($dst$$XMMRegister, $src$$XMMRegister, $mem$$Address, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
instruct vsub8B(vecD dst, vecD src) %{
predicate(UseAVX == 0 && n->as_Vector()->length() == 8);
match(Set dst (SubVB dst src));
@@ -6690,19 +6681,8 @@
ins_pipe( pipe_slow );
%}
-instruct vsub8B_reg_avx(vecD dst, vecD src1, vecD src2) %{
- predicate(VM_Version::supports_avxonly() && n->as_Vector()->length() == 8);
- match(Set dst (SubVB src1 src2));
- format %{ "vpsubb $dst,$src1,$src2\t! sub packed8B" %}
- ins_encode %{
- int vector_len = 0;
- __ vpsubb($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
-instruct vsub8B_reg_evex(vecD dst, vecD src1, vecD src2) %{
- predicate(VM_Version::supports_avx512bw() && n->as_Vector()->length() == 8);
+instruct vsub8B_reg(vecD dst, vecD src1, vecD src2) %{
+ predicate(UseAVX > 0 && n->as_Vector()->length() == 8);
match(Set dst (SubVB src1 src2));
format %{ "vpsubb $dst,$src1,$src2\t! sub packed8B" %}
ins_encode %{
@@ -6712,20 +6692,8 @@
ins_pipe( pipe_slow );
%}
-instruct vsub8B_reg_evex_special(vecD dst, vecD src1, vecD src2) %{
- predicate(VM_Version::supports_avx512nobw() && n->as_Vector()->length() == 8);
- match(Set dst (SubVB dst src2));
- effect(TEMP src1);
- format %{ "vpsubb $dst,$src1,$src2\t! sub packed8B" %}
- ins_encode %{
- int vector_len = 0;
- __ vpsubb($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
-instruct vsub8B_mem_avx(vecD dst, vecD src, memory mem) %{
- predicate(VM_Version::supports_avxonly() && n->as_Vector()->length() == 8);
+instruct vsub8B_mem(vecD dst, vecD src, memory mem) %{
+ predicate(UseAVX > 0 && n->as_Vector()->length() == 8);
match(Set dst (SubVB src (LoadVector mem)));
format %{ "vpsubb $dst,$src,$mem\t! sub packed8B" %}
ins_encode %{
@@ -6735,29 +6703,6 @@
ins_pipe( pipe_slow );
%}
-instruct vsub8B_mem_evex(vecD dst, vecD src, memory mem) %{
- predicate(VM_Version::supports_avx512bw() && n->as_Vector()->length() == 8);
- match(Set dst (SubVB src (LoadVector mem)));
- format %{ "vpsubb $dst,$src,$mem\t! sub packed8B" %}
- ins_encode %{
- int vector_len = 0;
- __ vpsubb($dst$$XMMRegister, $src$$XMMRegister, $mem$$Address, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
-instruct vsub8B_mem_evex_special(vecD dst, vecD src, memory mem) %{
- predicate(VM_Version::supports_avx512nobw() && n->as_Vector()->length() == 8);
- match(Set dst (SubVB dst (LoadVector mem)));
- effect(TEMP src);
- format %{ "vpsubb $dst,$src,$mem\t! sub packed8B" %}
- ins_encode %{
- int vector_len = 0;
- __ vpsubb($dst$$XMMRegister, $src$$XMMRegister, $mem$$Address, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
instruct vsub16B(vecX dst, vecX src) %{
predicate(UseAVX == 0 && n->as_Vector()->length() == 16);
match(Set dst (SubVB dst src));
@@ -6768,19 +6713,8 @@
ins_pipe( pipe_slow );
%}
-instruct vsub16B_reg_avx(vecX dst, vecX src1, vecX src2) %{
- predicate(VM_Version::supports_avxonly() && n->as_Vector()->length() == 16);
- match(Set dst (SubVB src1 src2));
- format %{ "vpsubb $dst,$src1,$src2\t! sub packed16B" %}
- ins_encode %{
- int vector_len = 0;
- __ vpsubb($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
-instruct vsub16B_reg_evex(vecX dst, vecX src1, vecX src2) %{
- predicate(VM_Version::supports_avx512bw() && n->as_Vector()->length() == 16);
+instruct vsub16B_reg(vecX dst, vecX src1, vecX src2) %{
+ predicate(UseAVX > 0 && n->as_Vector()->length() == 16);
match(Set dst (SubVB src1 src2));
format %{ "vpsubb $dst,$src1,$src2\t! sub packed16B" %}
ins_encode %{
@@ -6790,31 +6724,8 @@
ins_pipe( pipe_slow );
%}
-instruct vsub16B_reg_evex_special(vecX dst, vecX src1, vecX src2) %{
- predicate(VM_Version::supports_avx512nobw() && n->as_Vector()->length() == 16);
- match(Set dst (SubVB dst src2));
- effect(TEMP src1);
- format %{ "vpsubb $dst,$src1,$src2\t! sub packed16B" %}
- ins_encode %{
- int vector_len = 0;
- __ vpsubb($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
-instruct vsub16B_mem_avx(vecX dst, vecX src, memory mem) %{
- predicate(VM_Version::supports_avxonly() && n->as_Vector()->length() == 16);
- match(Set dst (SubVB src (LoadVector mem)));
- format %{ "vpsubb $dst,$src,$mem\t! sub packed16B" %}
- ins_encode %{
- int vector_len = 0;
- __ vpsubb($dst$$XMMRegister, $src$$XMMRegister, $mem$$Address, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
-instruct vsub16B_mem_evex(vecX dst, vecX src, memory mem) %{
- predicate(VM_Version::supports_avx512bw() && n->as_Vector()->length() == 16);
+instruct vsub16B_mem(vecX dst, vecX src, memory mem) %{
+ predicate(UseAVX > 0 && n->as_Vector()->length() == 16);
match(Set dst (SubVB src (LoadVector mem)));
format %{ "vpsubb $dst,$src,$mem\t! sub packed16B" %}
ins_encode %{
@@ -6824,31 +6735,8 @@
ins_pipe( pipe_slow );
%}
-instruct vsub16B_mem_evex_special(vecX dst, vecX src, memory mem) %{
- predicate(VM_Version::supports_avx512nobw() && n->as_Vector()->length() == 16);
- match(Set dst (SubVB dst (LoadVector mem)));
- effect(TEMP src);
- format %{ "vpsubb $dst,$src,$mem\t! sub packed16B" %}
- ins_encode %{
- int vector_len = 0;
- __ vpsubb($dst$$XMMRegister, $src$$XMMRegister, $mem$$Address, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
-instruct vsub32B_reg_avx(vecY dst, vecY src1, vecY src2) %{
- predicate(VM_Version::supports_avx256only() && n->as_Vector()->length() == 32);
- match(Set dst (SubVB src1 src2));
- format %{ "vpsubb $dst,$src1,$src2\t! sub packed32B" %}
- ins_encode %{
- int vector_len = 1;
- __ vpsubb($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
-instruct vsub32B_reg_evex(vecY dst, vecY src1, vecY src2) %{
- predicate(VM_Version::supports_avx512bw() && n->as_Vector()->length() == 32);
+instruct vsub32B_reg(vecY dst, vecY src1, vecY src2) %{
+ predicate(UseAVX > 1 && n->as_Vector()->length() == 32);
match(Set dst (SubVB src1 src2));
format %{ "vpsubb $dst,$src1,$src2\t! sub packed32B" %}
ins_encode %{
@@ -6858,20 +6746,8 @@
ins_pipe( pipe_slow );
%}
-instruct vsub32B_reg_evex_special(vecY dst, vecY src1, vecY src2) %{
- predicate(VM_Version::supports_avx512nobw() && n->as_Vector()->length() == 32);
- match(Set dst (SubVB dst src2));
- effect(TEMP src1);
- format %{ "vpsubb $dst,$src1,$src2\t! sub packed32B" %}
- ins_encode %{
- int vector_len = 1;
- __ vpsubb($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
-instruct vsub32B_mem_avx(vecY dst, vecY src, memory mem) %{
- predicate(VM_Version::supports_avx256only() && n->as_Vector()->length() == 32);
+instruct vsub32B_mem(vecY dst, vecY src, memory mem) %{
+ predicate(UseAVX > 1 && n->as_Vector()->length() == 32);
match(Set dst (SubVB src (LoadVector mem)));
format %{ "vpsubb $dst,$src,$mem\t! sub packed32B" %}
ins_encode %{
@@ -6881,31 +6757,8 @@
ins_pipe( pipe_slow );
%}
-instruct vsub32B_mem_evex(vecY dst, vecY src, memory mem) %{
- predicate(VM_Version::supports_avx512bw() && n->as_Vector()->length() == 32);
- match(Set dst (SubVB src (LoadVector mem)));
- format %{ "vpsubb $dst,$src,$mem\t! sub packed32B" %}
- ins_encode %{
- int vector_len = 1;
- __ vpsubb($dst$$XMMRegister, $src$$XMMRegister, $mem$$Address, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
-instruct vsub32B_mem_evex_special(vecY dst, vecY src, memory mem) %{
- predicate(VM_Version::supports_avx512nobw() && n->as_Vector()->length() == 32);
- match(Set dst (SubVB dst (LoadVector mem)));
- effect(TEMP src);
- format %{ "vpsubb $dst,$src,$mem\t! sub packed32B" %}
- ins_encode %{
- int vector_len = 1;
- __ vpsubb($dst$$XMMRegister, $src$$XMMRegister, $mem$$Address, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
instruct vsub64B_reg(vecZ dst, vecZ src1, vecZ src2) %{
- predicate(VM_Version::supports_avx512bw() && n->as_Vector()->length() == 64);
+ predicate(UseAVX > 2 && VM_Version::supports_avx512bw() && n->as_Vector()->length() == 64);
match(Set dst (SubVB src1 src2));
format %{ "vpsubb $dst,$src1,$src2\t! sub packed64B" %}
ins_encode %{
@@ -6916,7 +6769,7 @@
%}
instruct vsub64B_mem(vecZ dst, vecZ src, memory mem) %{
- predicate(VM_Version::supports_avx512bw() && n->as_Vector()->length() == 64);
+ predicate(UseAVX > 2 && VM_Version::supports_avx512bw() && n->as_Vector()->length() == 64);
match(Set dst (SubVB src (LoadVector mem)));
format %{ "vpsubb $dst,$src,$mem\t! sub packed64B" %}
ins_encode %{
@@ -6937,19 +6790,8 @@
ins_pipe( pipe_slow );
%}
-instruct vsub2S_reg_avx(vecS dst, vecS src1, vecS src2) %{
- predicate(VM_Version::supports_avxonly() && n->as_Vector()->length() == 2);
- match(Set dst (SubVS src1 src2));
- format %{ "vpsubw $dst,$src1,$src2\t! sub packed2S" %}
- ins_encode %{
- int vector_len = 0;
- __ vpsubw($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
-instruct vsub2S_reg_evex(vecS dst, vecS src1, vecS src2) %{
- predicate(VM_Version::supports_avx512bw() && n->as_Vector()->length() == 2);
+instruct vsub2S_reg(vecS dst, vecS src1, vecS src2) %{
+ predicate(UseAVX > 0 && n->as_Vector()->length() == 2);
match(Set dst (SubVS src1 src2));
format %{ "vpsubw $dst,$src1,$src2\t! sub packed2S" %}
ins_encode %{
@@ -6959,20 +6801,8 @@
ins_pipe( pipe_slow );
%}
-instruct vsub2S_reg_evex_special(vecS dst, vecS src1, vecS src2) %{
- predicate(VM_Version::supports_avx512nobw() && n->as_Vector()->length() == 2);
- match(Set dst (SubVS dst src2));
- effect(TEMP src1);
- format %{ "vpsubw $dst,$src1,$src2\t! sub packed2S" %}
- ins_encode %{
- int vector_len = 0;
- __ vpsubw($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
-instruct vsub2S_mem_avx(vecS dst, vecS src, memory mem) %{
- predicate(VM_Version::supports_avxonly() && n->as_Vector()->length() == 2);
+instruct vsub2S_mem(vecS dst, vecS src, memory mem) %{
+ predicate(UseAVX > 0 && n->as_Vector()->length() == 2);
match(Set dst (SubVS src (LoadVector mem)));
format %{ "vpsubw $dst,$src,$mem\t! sub packed2S" %}
ins_encode %{
@@ -6982,29 +6812,6 @@
ins_pipe( pipe_slow );
%}
-instruct vsub2S_mem_evex(vecS dst, vecS src, memory mem) %{
- predicate(VM_Version::supports_avx512bw() && n->as_Vector()->length() == 2);
- match(Set dst (SubVS src (LoadVector mem)));
- format %{ "vpsubw $dst,$src,$mem\t! sub packed2S" %}
- ins_encode %{
- int vector_len = 0;
- __ vpsubw($dst$$XMMRegister, $src$$XMMRegister, $mem$$Address, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
-instruct vsub2S_mem_evex_special(vecS dst, vecS src, memory mem) %{
- predicate(VM_Version::supports_avx512nobw() && n->as_Vector()->length() == 2);
- match(Set dst (SubVS dst (LoadVector mem)));
- effect(TEMP src);
- format %{ "vpsubw $dst,$src,$mem\t! sub packed2S" %}
- ins_encode %{
- int vector_len = 0;
- __ vpsubw($dst$$XMMRegister, $src$$XMMRegister, $mem$$Address, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
instruct vsub4S(vecD dst, vecD src) %{
predicate(UseAVX == 0 && n->as_Vector()->length() == 4);
match(Set dst (SubVS dst src));
@@ -7015,19 +6822,8 @@
ins_pipe( pipe_slow );
%}
-instruct vsub4S_reg_avx(vecD dst, vecD src1, vecD src2) %{
- predicate(VM_Version::supports_avxonly() && n->as_Vector()->length() == 4);
- match(Set dst (SubVS src1 src2));
- format %{ "vpsubw $dst,$src1,$src2\t! sub packed4S" %}
- ins_encode %{
- int vector_len = 0;
- __ vpsubw($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
-instruct vsub4S_reg_evex(vecD dst, vecD src1, vecD src2) %{
- predicate(VM_Version::supports_avx512bw() && n->as_Vector()->length() == 4);
+instruct vsub4S_reg(vecD dst, vecD src1, vecD src2) %{
+ predicate(UseAVX > 0 && n->as_Vector()->length() == 4);
match(Set dst (SubVS src1 src2));
format %{ "vpsubw $dst,$src1,$src2\t! sub packed4S" %}
ins_encode %{
@@ -7037,20 +6833,8 @@
ins_pipe( pipe_slow );
%}
-instruct vsub4S_reg_evex_special(vecD dst, vecD src1, vecD src2) %{
- predicate(VM_Version::supports_avx512nobw() && n->as_Vector()->length() == 4);
- match(Set dst (SubVS dst src2));
- effect(TEMP src1);
- format %{ "vpsubw $dst,$src1,$src2\t! sub packed4S" %}
- ins_encode %{
- int vector_len = 0;
- __ vpsubw($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
-instruct vsub4S_mem_avx(vecD dst, vecD src, memory mem) %{
- predicate(VM_Version::supports_avxonly() && n->as_Vector()->length() == 4);
+instruct vsub4S_mem(vecD dst, vecD src, memory mem) %{
+ predicate(UseAVX > 0 && n->as_Vector()->length() == 4);
match(Set dst (SubVS src (LoadVector mem)));
format %{ "vpsubw $dst,$src,$mem\t! sub packed4S" %}
ins_encode %{
@@ -7060,29 +6844,6 @@
ins_pipe( pipe_slow );
%}
-instruct vsub4S_mem_evex(vecD dst, vecD src, memory mem) %{
- predicate(VM_Version::supports_avx512bw() && n->as_Vector()->length() == 4);
- match(Set dst (SubVS src (LoadVector mem)));
- format %{ "vpsubw $dst,$src,$mem\t! sub packed4S" %}
- ins_encode %{
- int vector_len = 0;
- __ vpsubw($dst$$XMMRegister, $src$$XMMRegister, $mem$$Address, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
-instruct vsub4S_mem_evex_special(vecD dst, vecD src, memory mem) %{
- predicate(VM_Version::supports_avx512nobw() && n->as_Vector()->length() == 4);
- match(Set dst (SubVS dst (LoadVector mem)));
- effect(TEMP src);
- format %{ "vpsubw $dst,$src,$mem\t! sub packed4S" %}
- ins_encode %{
- int vector_len = 0;
- __ vpsubw($dst$$XMMRegister, $src$$XMMRegister, $mem$$Address, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
instruct vsub8S(vecX dst, vecX src) %{
predicate(UseAVX == 0 && n->as_Vector()->length() == 8);
match(Set dst (SubVS dst src));
@@ -7093,19 +6854,8 @@
ins_pipe( pipe_slow );
%}
-instruct vsub8S_reg_avx(vecX dst, vecX src1, vecX src2) %{
- predicate(VM_Version::supports_avxonly() && n->as_Vector()->length() == 8);
- match(Set dst (SubVS src1 src2));
- format %{ "vpsubw $dst,$src1,$src2\t! sub packed8S" %}
- ins_encode %{
- int vector_len = 0;
- __ vpsubw($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
-instruct vsub8S_reg_evex(vecX dst, vecX src1, vecX src2) %{
- predicate(VM_Version::supports_avx512bw() && n->as_Vector()->length() == 8);
+instruct vsub8S_reg(vecX dst, vecX src1, vecX src2) %{
+ predicate(UseAVX > 0 && n->as_Vector()->length() == 8);
match(Set dst (SubVS src1 src2));
format %{ "vpsubw $dst,$src1,$src2\t! sub packed8S" %}
ins_encode %{
@@ -7115,31 +6865,8 @@
ins_pipe( pipe_slow );
%}
-instruct vsub8S_reg_evex_special(vecX dst, vecX src1, vecX src2) %{
- predicate(VM_Version::supports_avx512nobw() && n->as_Vector()->length() == 8);
- match(Set dst (SubVS dst src2));
- effect(TEMP src1);
- format %{ "vpsubw $dst,$src1,$src2\t! sub packed8S" %}
- ins_encode %{
- int vector_len = 0;
- __ vpsubw($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
-instruct vsub8S_mem_avx(vecX dst, vecX src, memory mem) %{
- predicate(VM_Version::supports_avxonly() && n->as_Vector()->length() == 8);
- match(Set dst (SubVS src (LoadVector mem)));
- format %{ "vpsubw $dst,$src,$mem\t! sub packed8S" %}
- ins_encode %{
- int vector_len = 0;
- __ vpsubw($dst$$XMMRegister, $src$$XMMRegister, $mem$$Address, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
-instruct vsub8S_mem_evex(vecX dst, vecX src, memory mem) %{
- predicate(VM_Version::supports_avx512bw() && n->as_Vector()->length() == 8);
+instruct vsub8S_mem(vecX dst, vecX src, memory mem) %{
+ predicate(UseAVX > 0 && n->as_Vector()->length() == 8);
match(Set dst (SubVS src (LoadVector mem)));
format %{ "vpsubw $dst,$src,$mem\t! sub packed8S" %}
ins_encode %{
@@ -7149,31 +6876,8 @@
ins_pipe( pipe_slow );
%}
-instruct vsub8S_mem_evex_special(vecX dst, vecX src, memory mem) %{
- predicate(VM_Version::supports_avx512nobw() && n->as_Vector()->length() == 8);
- match(Set dst (SubVS dst (LoadVector mem)));
- effect(TEMP src);
- format %{ "vpsubw $dst,$src,$mem\t! sub packed8S" %}
- ins_encode %{
- int vector_len = 0;
- __ vpsubw($dst$$XMMRegister, $src$$XMMRegister, $mem$$Address, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
-instruct vsub16S_reg_avx(vecY dst, vecY src1, vecY src2) %{
- predicate(VM_Version::supports_avx256only() && n->as_Vector()->length() == 16);
- match(Set dst (SubVS src1 src2));
- format %{ "vpsubw $dst,$src1,$src2\t! sub packed16S" %}
- ins_encode %{
- int vector_len = 1;
- __ vpsubw($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
-instruct vsub16S_reg_evex(vecY dst, vecY src1, vecY src2) %{
- predicate(VM_Version::supports_avx512bw() && n->as_Vector()->length() == 16);
+instruct vsub16S_reg(vecY dst, vecY src1, vecY src2) %{
+ predicate(UseAVX > 1 && n->as_Vector()->length() == 16);
match(Set dst (SubVS src1 src2));
format %{ "vpsubw $dst,$src1,$src2\t! sub packed16S" %}
ins_encode %{
@@ -7183,20 +6887,8 @@
ins_pipe( pipe_slow );
%}
-instruct vsub16S_reg_evex_special(vecY dst, vecY src1, vecY src2) %{
- predicate(VM_Version::supports_avx512nobw() && n->as_Vector()->length() == 16);
- match(Set dst (SubVS dst src2));
- effect(TEMP src1);
- format %{ "vpsubw $dst,$src1,$src2\t! sub packed16S" %}
- ins_encode %{
- int vector_len = 1;
- __ vpsubw($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
-instruct vsub16S_mem_avx(vecY dst, vecY src, memory mem) %{
- predicate(VM_Version::supports_avx256only() && n->as_Vector()->length() == 16);
+instruct vsub16S_mem(vecY dst, vecY src, memory mem) %{
+ predicate(UseAVX > 1 && n->as_Vector()->length() == 16);
match(Set dst (SubVS src (LoadVector mem)));
format %{ "vpsubw $dst,$src,$mem\t! sub packed16S" %}
ins_encode %{
@@ -7206,31 +6898,8 @@
ins_pipe( pipe_slow );
%}
-instruct vsub16S_mem_evex(vecY dst, vecY src, memory mem) %{
- predicate(VM_Version::supports_avx512bw() && n->as_Vector()->length() == 16);
- match(Set dst (SubVS src (LoadVector mem)));
- format %{ "vpsubw $dst,$src,$mem\t! sub packed16S" %}
- ins_encode %{
- int vector_len = 1;
- __ vpsubw($dst$$XMMRegister, $src$$XMMRegister, $mem$$Address, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
-instruct vsub16S_mem_evex_special(vecY dst, vecY src, memory mem) %{
- predicate(VM_Version::supports_avx512nobw() && n->as_Vector()->length() == 16);
- match(Set dst (SubVS dst (LoadVector mem)));
- effect(TEMP src);
- format %{ "vpsubw $dst,$src,$mem\t! sub packed16S" %}
- ins_encode %{
- int vector_len = 1;
- __ vpsubw($dst$$XMMRegister, $src$$XMMRegister, $mem$$Address, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
instruct vsub32S_reg(vecZ dst, vecZ src1, vecZ src2) %{
- predicate(VM_Version::supports_avx512bw() && n->as_Vector()->length() == 32);
+ predicate(UseAVX > 2 && VM_Version::supports_avx512bw() && n->as_Vector()->length() == 32);
match(Set dst (SubVS src1 src2));
format %{ "vpsubw $dst,$src1,$src2\t! sub packed32S" %}
ins_encode %{
@@ -7241,7 +6910,7 @@
%}
instruct vsub32S_mem(vecZ dst, vecZ src, memory mem) %{
- predicate(VM_Version::supports_avx512bw() && n->as_Vector()->length() == 32);
+ predicate(UseAVX > 2 && VM_Version::supports_avx512bw() && n->as_Vector()->length() == 32);
match(Set dst (SubVS src (LoadVector mem)));
format %{ "vpsubw $dst,$src,$mem\t! sub packed32S" %}
ins_encode %{
@@ -7253,7 +6922,7 @@
// Integers vector sub
instruct vsub2I(vecD dst, vecD src) %{
- predicate(n->as_Vector()->length() == 2);
+ predicate(UseAVX == 0 && n->as_Vector()->length() == 2);
match(Set dst (SubVI dst src));
format %{ "psubd $dst,$src\t! sub packed2I" %}
ins_encode %{
@@ -7285,7 +6954,7 @@
%}
instruct vsub4I(vecX dst, vecX src) %{
- predicate(n->as_Vector()->length() == 4);
+ predicate(UseAVX == 0 && n->as_Vector()->length() == 4);
match(Set dst (SubVI dst src));
format %{ "psubd $dst,$src\t! sub packed4I" %}
ins_encode %{
@@ -7362,7 +7031,7 @@
// Longs vector sub
instruct vsub2L(vecX dst, vecX src) %{
- predicate(n->as_Vector()->length() == 2);
+ predicate(UseAVX == 0 && n->as_Vector()->length() == 2);
match(Set dst (SubVL dst src));
format %{ "psubq $dst,$src\t! sub packed2L" %}
ins_encode %{
@@ -7439,7 +7108,7 @@
// Floats vector sub
instruct vsub2F(vecD dst, vecD src) %{
- predicate(n->as_Vector()->length() == 2);
+ predicate(UseAVX == 0 && n->as_Vector()->length() == 2);
match(Set dst (SubVF dst src));
format %{ "subps $dst,$src\t! sub packed2F" %}
ins_encode %{
@@ -7471,7 +7140,7 @@
%}
instruct vsub4F(vecX dst, vecX src) %{
- predicate(n->as_Vector()->length() == 4);
+ predicate(UseAVX == 0 && n->as_Vector()->length() == 4);
match(Set dst (SubVF dst src));
format %{ "subps $dst,$src\t! sub packed4F" %}
ins_encode %{
@@ -7548,7 +7217,7 @@
// Doubles vector sub
instruct vsub2D(vecX dst, vecX src) %{
- predicate(n->as_Vector()->length() == 2);
+ predicate(UseAVX == 0 && n->as_Vector()->length() == 2);
match(Set dst (SubVD dst src));
format %{ "subpd $dst,$src\t! sub packed2D" %}
ins_encode %{
@@ -7636,19 +7305,8 @@
ins_pipe( pipe_slow );
%}
-instruct vmul2S_reg_avx(vecS dst, vecS src1, vecS src2) %{
- predicate(VM_Version::supports_avxonly() && n->as_Vector()->length() == 2);
- match(Set dst (MulVS src1 src2));
- format %{ "vpmullw $dst,$src1,$src2\t! mul packed2S" %}
- ins_encode %{
- int vector_len = 0;
- __ vpmullw($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
-instruct vmul2S_reg_evex(vecS dst, vecS src1, vecS src2) %{
- predicate(VM_Version::supports_avx512bw() && n->as_Vector()->length() == 2);
+instruct vmul2S_reg(vecS dst, vecS src1, vecS src2) %{
+ predicate(UseAVX > 0 && n->as_Vector()->length() == 2);
match(Set dst (MulVS src1 src2));
format %{ "vpmullw $dst,$src1,$src2\t! mul packed2S" %}
ins_encode %{
@@ -7658,20 +7316,8 @@
ins_pipe( pipe_slow );
%}
-instruct vmul2S_evex_special(vecS dst, vecS src1, vecS src2) %{
- predicate(VM_Version::supports_avx512nobw() && n->as_Vector()->length() == 2);
- match(Set dst (MulVS dst src2));
- effect(TEMP src1);
- format %{ "vpmullw $dst,$src1,$src2\t! mul packed2S" %}
- ins_encode %{
- int vector_len = 0;
- __ vpmullw($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
-instruct vmul2S_mem_avx(vecS dst, vecS src, memory mem) %{
- predicate(VM_Version::supports_avxonly() && n->as_Vector()->length() == 2);
+instruct vmul2S_mem(vecS dst, vecS src, memory mem) %{
+ predicate(UseAVX > 0 && n->as_Vector()->length() == 2);
match(Set dst (MulVS src (LoadVector mem)));
format %{ "vpmullw $dst,$src,$mem\t! mul packed2S" %}
ins_encode %{
@@ -7681,29 +7327,6 @@
ins_pipe( pipe_slow );
%}
-instruct vmul2S_mem_evex(vecS dst, vecS src, memory mem) %{
- predicate(VM_Version::supports_avx512bw() && n->as_Vector()->length() == 2);
- match(Set dst (MulVS src (LoadVector mem)));
- format %{ "vpmullw $dst,$src,$mem\t! mul packed2S" %}
- ins_encode %{
- int vector_len = 0;
- __ vpmullw($dst$$XMMRegister, $src$$XMMRegister, $mem$$Address, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
-instruct vmul2S_mem_evex_special(vecS dst, vecS src, memory mem) %{
- predicate(VM_Version::supports_avx512nobw() && n->as_Vector()->length() == 2);
- match(Set dst (MulVS dst (LoadVector mem)));
- effect(TEMP src);
- format %{ "vpmullw $dst,$src,$mem\t! mul packed2S" %}
- ins_encode %{
- int vector_len = 0;
- __ vpmullw($dst$$XMMRegister, $src$$XMMRegister, $mem$$Address, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
instruct vmul4S(vecD dst, vecD src) %{
predicate(UseAVX == 0 && n->as_Vector()->length() == 4);
match(Set dst (MulVS dst src));
@@ -7714,19 +7337,8 @@
ins_pipe( pipe_slow );
%}
-instruct vmul4S_reg_avx(vecD dst, vecD src1, vecD src2) %{
- predicate(VM_Version::supports_avxonly() && n->as_Vector()->length() == 4);
- match(Set dst (MulVS src1 src2));
- format %{ "vpmullw $dst,$src1,$src2\t! mul packed4S" %}
- ins_encode %{
- int vector_len = 0;
- __ vpmullw($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
-instruct vmul4S_reg_evex(vecD dst, vecD src1, vecD src2) %{
- predicate(VM_Version::supports_avx512bw() && n->as_Vector()->length() == 4);
+instruct vmul4S_reg(vecD dst, vecD src1, vecD src2) %{
+ predicate(UseAVX > 0 && n->as_Vector()->length() == 4);
match(Set dst (MulVS src1 src2));
format %{ "vpmullw $dst,$src1,$src2\t! mul packed4S" %}
ins_encode %{
@@ -7736,20 +7348,8 @@
ins_pipe( pipe_slow );
%}
-instruct vmul4S_reg_evex_special(vecD dst, vecD src1, vecD src2) %{
- predicate(VM_Version::supports_avx512nobw() && n->as_Vector()->length() == 4);
- match(Set dst (MulVS dst src2));
- effect(TEMP src1);
- format %{ "vpmullw $dst,$src1,$src2\t! mul packed4S" %}
- ins_encode %{
- int vector_len = 0;
- __ vpmullw($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
-instruct vmul4S_mem_avx(vecD dst, vecD src, memory mem) %{
- predicate(VM_Version::supports_avxonly() && n->as_Vector()->length() == 4);
+instruct vmul4S_mem(vecD dst, vecD src, memory mem) %{
+ predicate(UseAVX > 0 && n->as_Vector()->length() == 4);
match(Set dst (MulVS src (LoadVector mem)));
format %{ "vpmullw $dst,$src,$mem\t! mul packed4S" %}
ins_encode %{
@@ -7759,29 +7359,6 @@
ins_pipe( pipe_slow );
%}
-instruct vmul4S_mem_evex(vecD dst, vecD src, memory mem) %{
- predicate(VM_Version::supports_avx512bw() && n->as_Vector()->length() == 4);
- match(Set dst (MulVS src (LoadVector mem)));
- format %{ "vpmullw $dst,$src,$mem\t! mul packed4S" %}
- ins_encode %{
- int vector_len = 0;
- __ vpmullw($dst$$XMMRegister, $src$$XMMRegister, $mem$$Address, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
-instruct vmul4S_mem_evex_special(vecD dst, vecD src, memory mem) %{
- predicate(VM_Version::supports_avx512nobw() && n->as_Vector()->length() == 4);
- match(Set dst (MulVS dst (LoadVector mem)));
- effect(TEMP src);
- format %{ "vpmullw $dst,$src,$mem\t! mul packed4S" %}
- ins_encode %{
- int vector_len = 0;
- __ vpmullw($dst$$XMMRegister, $src$$XMMRegister, $mem$$Address, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
instruct vmul8S(vecX dst, vecX src) %{
predicate(UseAVX == 0 && n->as_Vector()->length() == 8);
match(Set dst (MulVS dst src));
@@ -7792,19 +7369,8 @@
ins_pipe( pipe_slow );
%}
-instruct vmul8S_reg_avx(vecX dst, vecX src1, vecX src2) %{
- predicate(VM_Version::supports_avxonly() && n->as_Vector()->length() == 8);
- match(Set dst (MulVS src1 src2));
- format %{ "vpmullw $dst,$src1,$src2\t! mul packed8S" %}
- ins_encode %{
- int vector_len = 0;
- __ vpmullw($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
-instruct vmul8S_reg_evex(vecX dst, vecX src1, vecX src2) %{
- predicate(VM_Version::supports_avx512bw() && n->as_Vector()->length() == 8);
+instruct vmul8S_reg(vecX dst, vecX src1, vecX src2) %{
+ predicate(UseAVX > 0 && n->as_Vector()->length() == 8);
match(Set dst (MulVS src1 src2));
format %{ "vpmullw $dst,$src1,$src2\t! mul packed8S" %}
ins_encode %{
@@ -7814,31 +7380,8 @@
ins_pipe( pipe_slow );
%}
-instruct vmul8S_reg_evex_special(vecX dst, vecX src1, vecX src2) %{
- predicate(VM_Version::supports_avx512nobw() && n->as_Vector()->length() == 8);
- match(Set dst (MulVS dst src2));
- effect(TEMP src1);
- format %{ "vpmullw $dst,$src1,$src2\t! mul packed8S" %}
- ins_encode %{
- int vector_len = 0;
- __ vpmullw($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
-instruct vmul8S_mem_avx(vecX dst, vecX src, memory mem) %{
- predicate(VM_Version::supports_avxonly() && n->as_Vector()->length() == 8);
- match(Set dst (MulVS src (LoadVector mem)));
- format %{ "vpmullw $dst,$src,$mem\t! mul packed8S" %}
- ins_encode %{
- int vector_len = 0;
- __ vpmullw($dst$$XMMRegister, $src$$XMMRegister, $mem$$Address, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
-instruct vmul8S_mem_evex(vecX dst, vecX src, memory mem) %{
- predicate(VM_Version::supports_avx512bw() && n->as_Vector()->length() == 8);
+instruct vmul8S_mem(vecX dst, vecX src, memory mem) %{
+ predicate(UseAVX > 0 && n->as_Vector()->length() == 8);
match(Set dst (MulVS src (LoadVector mem)));
format %{ "vpmullw $dst,$src,$mem\t! mul packed8S" %}
ins_encode %{
@@ -7848,31 +7391,8 @@
ins_pipe( pipe_slow );
%}
-instruct vmul8S_mem_evex_special(vecX dst, vecX src, memory mem) %{
- predicate(VM_Version::supports_avx512nobw() && n->as_Vector()->length() == 8);
- match(Set dst (MulVS dst (LoadVector mem)));
- effect(TEMP src);
- format %{ "vpmullw $dst,$src,$mem\t! mul packed8S" %}
- ins_encode %{
- int vector_len = 0;
- __ vpmullw($dst$$XMMRegister, $src$$XMMRegister, $mem$$Address, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
-instruct vmul16S_reg_avx(vecY dst, vecY src1, vecY src2) %{
- predicate(VM_Version::supports_avx256only() && n->as_Vector()->length() == 16);
- match(Set dst (MulVS src1 src2));
- format %{ "vpmullw $dst,$src1,$src2\t! mul packed16S" %}
- ins_encode %{
- int vector_len = 1;
- __ vpmullw($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
-instruct vmul16S_reg_evex(vecY dst, vecY src1, vecY src2) %{
- predicate(VM_Version::supports_avx512bw() && n->as_Vector()->length() == 16);
+instruct vmul16S_reg(vecY dst, vecY src1, vecY src2) %{
+ predicate(UseAVX > 1 && n->as_Vector()->length() == 16);
match(Set dst (MulVS src1 src2));
format %{ "vpmullw $dst,$src1,$src2\t! mul packed16S" %}
ins_encode %{
@@ -7882,20 +7402,8 @@
ins_pipe( pipe_slow );
%}
-instruct vmul16S_reg_evex_special(vecY dst, vecY src1, vecY src2) %{
- predicate(VM_Version::supports_avx512nobw() && n->as_Vector()->length() == 16);
- match(Set dst (MulVS dst src2));
- effect(TEMP src1);
- format %{ "vpmullw $dst,$src1,$src2\t! mul packed16S" %}
- ins_encode %{
- int vector_len = 1;
- __ vpmullw($dst$$XMMRegister, $src1$$XMMRegister, $src2$$XMMRegister, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
-instruct vmul16S_mem_avx(vecY dst, vecY src, memory mem) %{
- predicate(VM_Version::supports_avx256only() && n->as_Vector()->length() == 16);
+instruct vmul16S_mem(vecY dst, vecY src, memory mem) %{
+ predicate(UseAVX > 1 && n->as_Vector()->length() == 16);
match(Set dst (MulVS src (LoadVector mem)));
format %{ "vpmullw $dst,$src,$mem\t! mul packed16S" %}
ins_encode %{
@@ -7905,31 +7413,8 @@
ins_pipe( pipe_slow );
%}
-instruct vmul16S_mem_evex(vecY dst, vecY src, memory mem) %{
- predicate(VM_Version::supports_avx512bw() && n->as_Vector()->length() == 16);
- match(Set dst (MulVS src (LoadVector mem)));
- format %{ "vpmullw $dst,$src,$mem\t! mul packed16S" %}
- ins_encode %{
- int vector_len = 1;
- __ vpmullw($dst$$XMMRegister, $src$$XMMRegister, $mem$$Address, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
-instruct vmul16S_mem_evex_special(vecY dst, vecY src, memory mem) %{
- predicate(VM_Version::supports_avx512nobw() && n->as_Vector()->length() == 16);
- match(Set dst (MulVS dst (LoadVector mem)));
- effect(TEMP src);
- format %{ "vpmullw $dst,$src,$mem\t! mul packed16S" %}
- ins_encode %{
- int vector_len = 1;
- __ vpmullw($dst$$XMMRegister, $src$$XMMRegister, $mem$$Address, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
instruct vmul32S_reg(vecZ dst, vecZ src1, vecZ src2) %{
- predicate(VM_Version::supports_avx512bw() && n->as_Vector()->length() == 32);
+ predicate(UseAVX > 2 && VM_Version::supports_avx512bw() && n->as_Vector()->length() == 32);
match(Set dst (MulVS src1 src2));
format %{ "vpmullw $dst,$src1,$src2\t! mul packed32S" %}
ins_encode %{
@@ -7940,7 +7425,7 @@
%}
instruct vmul32S_mem(vecZ dst, vecZ src, memory mem) %{
- predicate(VM_Version::supports_avx512bw() && n->as_Vector()->length() == 32);
+ predicate(UseAVX > 2 && VM_Version::supports_avx512bw() && n->as_Vector()->length() == 32);
match(Set dst (MulVS src (LoadVector mem)));
format %{ "vpmullw $dst,$src,$mem\t! mul packed32S" %}
ins_encode %{
@@ -8127,7 +7612,7 @@
// Floats vector mul
instruct vmul2F(vecD dst, vecD src) %{
- predicate(n->as_Vector()->length() == 2);
+ predicate(UseAVX == 0 && n->as_Vector()->length() == 2);
match(Set dst (MulVF dst src));
format %{ "mulps $dst,$src\t! mul packed2F" %}
ins_encode %{
@@ -8159,7 +7644,7 @@
%}
instruct vmul4F(vecX dst, vecX src) %{
- predicate(n->as_Vector()->length() == 4);
+ predicate(UseAVX == 0 && n->as_Vector()->length() == 4);
match(Set dst (MulVF dst src));
format %{ "mulps $dst,$src\t! mul packed4F" %}
ins_encode %{
@@ -8236,7 +7721,7 @@
// Doubles vector mul
instruct vmul2D(vecX dst, vecX src) %{
- predicate(n->as_Vector()->length() == 2);
+ predicate(UseAVX == 0 && n->as_Vector()->length() == 2);
match(Set dst (MulVD dst src));
format %{ "mulpd $dst,$src\t! mul packed2D" %}
ins_encode %{
@@ -8311,8 +7796,8 @@
ins_pipe( pipe_slow );
%}
-instruct vcmov8F_reg(vecY dst, vecY src1, vecY src2, immI8 cop, cmpOp_vcmppd copnd) %{
- predicate(UseAVX > 0 && UseAVX < 3 && n->as_Vector()->length() == 8);
+instruct vcmov8F_reg(legVecY dst, legVecY src1, legVecY src2, immI8 cop, cmpOp_vcmppd copnd) %{
+ predicate(UseAVX > 0 && n->as_Vector()->length() == 8);
match(Set dst (CMoveVF (Binary copnd cop) (Binary src1 src2)));
effect(TEMP dst, USE src1, USE src2);
format %{ "cmpps.$copnd $dst, $src1, $src2 ! vcmovevf, cond=$cop\n\t"
@@ -8327,8 +7812,8 @@
ins_pipe( pipe_slow );
%}
-instruct vcmov4D_reg(vecY dst, vecY src1, vecY src2, immI8 cop, cmpOp_vcmppd copnd) %{
- predicate(UseAVX > 0 && UseAVX < 3 && n->as_Vector()->length() == 4);
+instruct vcmov4D_reg(legVecY dst, legVecY src1, legVecY src2, immI8 cop, cmpOp_vcmppd copnd) %{
+ predicate(UseAVX > 0 && n->as_Vector()->length() == 4);
match(Set dst (CMoveVD (Binary copnd cop) (Binary src1 src2)));
effect(TEMP dst, USE src1, USE src2);
format %{ "cmppd.$copnd $dst, $src1, $src2 ! vcmovevd, cond=$cop\n\t"
@@ -8347,7 +7832,7 @@
// Floats vector div
instruct vdiv2F(vecD dst, vecD src) %{
- predicate(n->as_Vector()->length() == 2);
+ predicate(UseAVX == 0 && n->as_Vector()->length() == 2);
match(Set dst (DivVF dst src));
format %{ "divps $dst,$src\t! div packed2F" %}
ins_encode %{
@@ -8379,7 +7864,7 @@
%}
instruct vdiv4F(vecX dst, vecX src) %{
- predicate(n->as_Vector()->length() == 4);
+ predicate(UseAVX == 0 && n->as_Vector()->length() == 4);
match(Set dst (DivVF dst src));
format %{ "divps $dst,$src\t! div packed4F" %}
ins_encode %{
@@ -8456,7 +7941,7 @@
// Doubles vector div
instruct vdiv2D(vecX dst, vecX src) %{
- predicate(n->as_Vector()->length() == 2);
+ predicate(UseAVX == 0 && n->as_Vector()->length() == 2);
match(Set dst (DivVD dst src));
format %{ "divpd $dst,$src\t! div packed2D" %}
ins_encode %{
@@ -8725,19 +8210,8 @@
ins_pipe( pipe_slow );
%}
-instruct vsll2S_reg_avx(vecS dst, vecS src, vecS shift) %{
- predicate(VM_Version::supports_avxonly() && n->as_Vector()->length() == 2);
- match(Set dst (LShiftVS src shift));
- format %{ "vpsllw $dst,$src,$shift\t! left shift packed2S" %}
- ins_encode %{
- int vector_len = 0;
- __ vpsllw($dst$$XMMRegister, $src$$XMMRegister, $shift$$XMMRegister, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
-instruct vsll2S_reg_evex(vecS dst, vecS src, vecS shift) %{
- predicate(VM_Version::supports_avx512bw() && n->as_Vector()->length() == 2);
+instruct vsll2S_reg(vecS dst, vecS src, vecS shift) %{
+ predicate(UseAVX > 0 && n->as_Vector()->length() == 2);
match(Set dst (LShiftVS src shift));
format %{ "vpsllw $dst,$src,$shift\t! left shift packed2S" %}
ins_encode %{
@@ -8747,20 +8221,8 @@
ins_pipe( pipe_slow );
%}
-instruct vsll2S_reg_evex_special(vecS dst, vecS src, vecS shift) %{
- predicate(VM_Version::supports_avx512nobw() && n->as_Vector()->length() == 2);
- match(Set dst (LShiftVS dst shift));
- effect(TEMP src);
- format %{ "vpsllw $dst,$src,$shift\t! left shift packed2S" %}
- ins_encode %{
- int vector_len = 0;
- __ vpsllw($dst$$XMMRegister, $src$$XMMRegister, $shift$$XMMRegister, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
-instruct vsll2S_reg_imm_avx(vecS dst, vecS src, immI8 shift) %{
- predicate(VM_Version::supports_avxonly() && n->as_Vector()->length() == 2);
+instruct vsll2S_reg_imm(vecS dst, vecS src, immI8 shift) %{
+ predicate(UseAVX > 0 && n->as_Vector()->length() == 2);
match(Set dst (LShiftVS src shift));
format %{ "vpsllw $dst,$src,$shift\t! left shift packed2S" %}
ins_encode %{
@@ -8770,29 +8232,6 @@
ins_pipe( pipe_slow );
%}
-instruct vsll2S_reg_imm_evex(vecS dst, vecS src, immI8 shift) %{
- predicate(VM_Version::supports_avx512bw() && n->as_Vector()->length() == 2);
- match(Set dst (LShiftVS src shift));
- format %{ "vpsllw $dst,$src,$shift\t! left shift packed2S" %}
- ins_encode %{
- int vector_len = 0;
- __ vpsllw($dst$$XMMRegister, $src$$XMMRegister, (int)$shift$$constant, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
-instruct vsll2S_reg_imm_evex_special(vecS dst, vecS src, immI8 shift) %{
- predicate(VM_Version::supports_avx512nobw() && n->as_Vector()->length() == 2);
- match(Set dst (LShiftVS dst shift));
- effect(TEMP src);
- format %{ "vpsllw $dst,$src,$shift\t! left shift packed2S" %}
- ins_encode %{
- int vector_len = 0;
- __ vpsllw($dst$$XMMRegister, $src$$XMMRegister, (int)$shift$$constant, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
instruct vsll4S(vecD dst, vecS shift) %{
predicate(UseAVX == 0 && n->as_Vector()->length() == 4);
match(Set dst (LShiftVS dst shift));
@@ -8813,19 +8252,8 @@
ins_pipe( pipe_slow );
%}
-instruct vsll4S_reg_avx(vecD dst, vecD src, vecS shift) %{
- predicate(VM_Version::supports_avxonly() && n->as_Vector()->length() == 4);
- match(Set dst (LShiftVS src shift));
- format %{ "vpsllw $dst,$src,$shift\t! left shift packed4S" %}
- ins_encode %{
- int vector_len = 0;
- __ vpsllw($dst$$XMMRegister, $src$$XMMRegister, $shift$$XMMRegister, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
-instruct vsll4S_reg_evex(vecD dst, vecD src, vecS shift) %{
- predicate(VM_Version::supports_avx512bw() && n->as_Vector()->length() == 4);
+instruct vsll4S_reg(vecD dst, vecD src, vecS shift) %{
+ predicate(UseAVX > 0 && n->as_Vector()->length() == 4);
match(Set dst (LShiftVS src shift));
format %{ "vpsllw $dst,$src,$shift\t! left shift packed4S" %}
ins_encode %{
@@ -8835,20 +8263,8 @@
ins_pipe( pipe_slow );
%}
-instruct vsll4S_reg_evex_special(vecD dst, vecD src, vecS shift) %{
- predicate(VM_Version::supports_avx512nobw() && n->as_Vector()->length() == 4);
- match(Set dst (LShiftVS dst shift));
- effect(TEMP src);
- format %{ "vpsllw $dst,$src,$shift\t! left shift packed4S" %}
- ins_encode %{
- int vector_len = 0;
- __ vpsllw($dst$$XMMRegister, $src$$XMMRegister, $shift$$XMMRegister, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
-instruct vsll4S_reg_imm_avx(vecD dst, vecD src, immI8 shift) %{
- predicate(VM_Version::supports_avxonly() && n->as_Vector()->length() == 4);
+instruct vsll4S_reg_imm(vecD dst, vecD src, immI8 shift) %{
+ predicate(UseAVX > 0 && n->as_Vector()->length() == 4);
match(Set dst (LShiftVS src shift));
format %{ "vpsllw $dst,$src,$shift\t! left shift packed4S" %}
ins_encode %{
@@ -8858,29 +8274,6 @@
ins_pipe( pipe_slow );
%}
-instruct vsll4S_reg_imm_evex(vecD dst, vecD src, immI8 shift) %{
- predicate(VM_Version::supports_avx512bw() && n->as_Vector()->length() == 4);
- match(Set dst (LShiftVS src shift));
- format %{ "vpsllw $dst,$src,$shift\t! left shift packed4S" %}
- ins_encode %{
- int vector_len = 0;
- __ vpsllw($dst$$XMMRegister, $src$$XMMRegister, (int)$shift$$constant, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
-instruct vsll4S_reg_imm_evex_special(vecD dst, vecD src, immI8 shift) %{
- predicate(VM_Version::supports_avx512nobw() && n->as_Vector()->length() == 4);
- match(Set dst (LShiftVS dst shift));
- effect(TEMP src);
- format %{ "vpsllw $dst,$src,$shift\t! left shift packed4S" %}
- ins_encode %{
- int vector_len = 0;
- __ vpsllw($dst$$XMMRegister, $src$$XMMRegister, (int)$shift$$constant, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
instruct vsll8S(vecX dst, vecS shift) %{
predicate(UseAVX == 0 && n->as_Vector()->length() == 8);
match(Set dst (LShiftVS dst shift));
@@ -8901,19 +8294,8 @@
ins_pipe( pipe_slow );
%}
-instruct vsll8S_reg_avx(vecX dst, vecX src, vecS shift) %{
- predicate(VM_Version::supports_avxonly() && n->as_Vector()->length() == 8);
- match(Set dst (LShiftVS src shift));
- format %{ "vpsllw $dst,$src,$shift\t! left shift packed8S" %}
- ins_encode %{
- int vector_len = 0;
- __ vpsllw($dst$$XMMRegister, $src$$XMMRegister, $shift$$XMMRegister, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
-instruct vsll8S_reg_evex(vecX dst, vecX src, vecS shift) %{
- predicate(VM_Version::supports_avx512bw() && n->as_Vector()->length() == 8);
+instruct vsll8S_reg(vecX dst, vecX src, vecS shift) %{
+ predicate(UseAVX > 0 && n->as_Vector()->length() == 8);
match(Set dst (LShiftVS src shift));
format %{ "vpsllw $dst,$src,$shift\t! left shift packed8S" %}
ins_encode %{
@@ -8923,31 +8305,8 @@
ins_pipe( pipe_slow );
%}
-instruct vsll8S_reg_evex_special(vecX dst, vecX src, vecS shift) %{
- predicate(VM_Version::supports_avx512nobw() && n->as_Vector()->length() == 8);
- match(Set dst (LShiftVS dst shift));
- effect(TEMP src);
- format %{ "vpsllw $dst,$src,$shift\t! left shift packed8S" %}
- ins_encode %{
- int vector_len = 0;
- __ vpsllw($dst$$XMMRegister, $src$$XMMRegister, $shift$$XMMRegister, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
-instruct vsll8S_reg_imm_avx(vecX dst, vecX src, immI8 shift) %{
- predicate(VM_Version::supports_avxonly() && n->as_Vector()->length() == 8);
- match(Set dst (LShiftVS src shift));
- format %{ "vpsllw $dst,$src,$shift\t! left shift packed8S" %}
- ins_encode %{
- int vector_len = 0;
- __ vpsllw($dst$$XMMRegister, $src$$XMMRegister, (int)$shift$$constant, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
-instruct vsll8S_reg_imm_evex(vecX dst, vecX src, immI8 shift) %{
- predicate(VM_Version::supports_avx512bw() && n->as_Vector()->length() == 8);
+instruct vsll8S_reg_imm(vecX dst, vecX src, immI8 shift) %{
+ predicate(UseAVX > 0 && n->as_Vector()->length() == 8);
match(Set dst (LShiftVS src shift));
format %{ "vpsllw $dst,$src,$shift\t! left shift packed8S" %}
ins_encode %{
@@ -8957,31 +8316,8 @@
ins_pipe( pipe_slow );
%}
-instruct vsll8S_reg_imm_evex_special(vecX dst, vecX src, immI8 shift) %{
- predicate(VM_Version::supports_avx512nobw() && n->as_Vector()->length() == 8);
- match(Set dst (LShiftVS dst shift));
- effect(TEMP src);
- format %{ "vpsllw $dst,$src,$shift\t! left shift packed8S" %}
- ins_encode %{
- int vector_len = 0;
- __ vpsllw($dst$$XMMRegister, $src$$XMMRegister, (int)$shift$$constant, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
-instruct vsll16S_reg_avx(vecY dst, vecY src, vecS shift) %{
- predicate(VM_Version::supports_avx256only() && n->as_Vector()->length() == 16);
- match(Set dst (LShiftVS src shift));
- format %{ "vpsllw $dst,$src,$shift\t! left shift packed16S" %}
- ins_encode %{
- int vector_len = 1;
- __ vpsllw($dst$$XMMRegister, $src$$XMMRegister, $shift$$XMMRegister, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
-instruct vsll16S_reg_evex(vecY dst, vecY src, vecS shift) %{
- predicate(VM_Version::supports_avx512bw() && n->as_Vector()->length() == 16);
+instruct vsll16S_reg(vecY dst, vecY src, vecS shift) %{
+ predicate(UseAVX > 1 && n->as_Vector()->length() == 16);
match(Set dst (LShiftVS src shift));
format %{ "vpsllw $dst,$src,$shift\t! left shift packed16S" %}
ins_encode %{
@@ -8991,20 +8327,8 @@
ins_pipe( pipe_slow );
%}
-instruct vsll16S_reg_evex_special(vecY dst, vecY src, vecS shift) %{
- predicate(VM_Version::supports_avx512nobw() && n->as_Vector()->length() == 16);
- match(Set dst (LShiftVS dst shift));
- effect(TEMP src);
- format %{ "vpsllw $dst,$src,$shift\t! left shift packed16S" %}
- ins_encode %{
- int vector_len = 1;
- __ vpsllw($dst$$XMMRegister, $src$$XMMRegister, $shift$$XMMRegister, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
-instruct vsll16S_reg_imm_avx(vecY dst, vecY src, immI8 shift) %{
- predicate(VM_Version::supports_avx256only() && n->as_Vector()->length() == 16);
+instruct vsll16S_reg_imm(vecY dst, vecY src, immI8 shift) %{
+ predicate(UseAVX > 1 && n->as_Vector()->length() == 16);
match(Set dst (LShiftVS src shift));
format %{ "vpsllw $dst,$src,$shift\t! left shift packed16S" %}
ins_encode %{
@@ -9014,31 +8338,8 @@
ins_pipe( pipe_slow );
%}
-instruct vsll16S_reg_imm_evex(vecY dst, vecY src, immI8 shift) %{
- predicate(VM_Version::supports_avx512bw() && n->as_Vector()->length() == 16);
- match(Set dst (LShiftVS src shift));
- format %{ "vpsllw $dst,$src,$shift\t! left shift packed16S" %}
- ins_encode %{
- int vector_len = 1;
- __ vpsllw($dst$$XMMRegister, $src$$XMMRegister, (int)$shift$$constant, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
-instruct vsll16S_reg_imm_evex_special(vecY dst, vecY src, immI8 shift) %{
- predicate(VM_Version::supports_avx512nobw() && n->as_Vector()->length() == 16);
- match(Set dst (LShiftVS dst shift));
- effect(TEMP src);
- format %{ "vpsllw $dst,$src,$shift\t! left shift packed16S" %}
- ins_encode %{
- int vector_len = 1;
- __ vpsllw($dst$$XMMRegister, $src$$XMMRegister, (int)$shift$$constant, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
instruct vsll32S_reg(vecZ dst, vecZ src, vecS shift) %{
- predicate(VM_Version::supports_avx512bw() && n->as_Vector()->length() == 32);
+ predicate(UseAVX > 2 && VM_Version::supports_avx512bw() && n->as_Vector()->length() == 32);
match(Set dst (LShiftVS src shift));
format %{ "vpsllw $dst,$src,$shift\t! left shift packed32S" %}
ins_encode %{
@@ -9049,7 +8350,7 @@
%}
instruct vsll32S_reg_imm(vecZ dst, vecZ src, immI8 shift) %{
- predicate(VM_Version::supports_avx512bw() && n->as_Vector()->length() == 32);
+ predicate(UseAVX > 2 && VM_Version::supports_avx512bw() && n->as_Vector()->length() == 32);
match(Set dst (LShiftVS src shift));
format %{ "vpsllw $dst,$src,$shift\t! left shift packed32S" %}
ins_encode %{
@@ -9061,7 +8362,7 @@
// Integers vector left shift
instruct vsll2I(vecD dst, vecS shift) %{
- predicate(n->as_Vector()->length() == 2);
+ predicate(UseAVX == 0 && n->as_Vector()->length() == 2);
match(Set dst (LShiftVI dst shift));
format %{ "pslld $dst,$shift\t! left shift packed2I" %}
ins_encode %{
@@ -9071,7 +8372,7 @@
%}
instruct vsll2I_imm(vecD dst, immI8 shift) %{
- predicate(n->as_Vector()->length() == 2);
+ predicate(UseAVX == 0 && n->as_Vector()->length() == 2);
match(Set dst (LShiftVI dst shift));
format %{ "pslld $dst,$shift\t! left shift packed2I" %}
ins_encode %{
@@ -9103,7 +8404,7 @@
%}
instruct vsll4I(vecX dst, vecS shift) %{
- predicate(n->as_Vector()->length() == 4);
+ predicate(UseAVX == 0 && n->as_Vector()->length() == 4);
match(Set dst (LShiftVI dst shift));
format %{ "pslld $dst,$shift\t! left shift packed4I" %}
ins_encode %{
@@ -9113,7 +8414,7 @@
%}
instruct vsll4I_imm(vecX dst, immI8 shift) %{
- predicate(n->as_Vector()->length() == 4);
+ predicate(UseAVX == 0 && n->as_Vector()->length() == 4);
match(Set dst (LShiftVI dst shift));
format %{ "pslld $dst,$shift\t! left shift packed4I" %}
ins_encode %{
@@ -9190,7 +8491,7 @@
// Longs vector left shift
instruct vsll2L(vecX dst, vecS shift) %{
- predicate(n->as_Vector()->length() == 2);
+ predicate(UseAVX == 0 && n->as_Vector()->length() == 2);
match(Set dst (LShiftVL dst shift));
format %{ "psllq $dst,$shift\t! left shift packed2L" %}
ins_encode %{
@@ -9200,7 +8501,7 @@
%}
instruct vsll2L_imm(vecX dst, immI8 shift) %{
- predicate(n->as_Vector()->length() == 2);
+ predicate(UseAVX == 0 && n->as_Vector()->length() == 2);
match(Set dst (LShiftVL dst shift));
format %{ "psllq $dst,$shift\t! left shift packed2L" %}
ins_encode %{
@@ -9302,19 +8603,8 @@
ins_pipe( pipe_slow );
%}
-instruct vsrl2S_reg_avx(vecS dst, vecS src, vecS shift) %{
- predicate(VM_Version::supports_avxonly() && n->as_Vector()->length() == 2);
- match(Set dst (URShiftVS src shift));
- format %{ "vpsrlw $dst,$src,$shift\t! logical right shift packed2S" %}
- ins_encode %{
- int vector_len = 0;
- __ vpsrlw($dst$$XMMRegister, $src$$XMMRegister, $shift$$XMMRegister, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
-instruct vsrl2S_reg_evex(vecS dst, vecS src, vecS shift) %{
- predicate(VM_Version::supports_avx512bw() && n->as_Vector()->length() == 2);
+instruct vsrl2S_reg(vecS dst, vecS src, vecS shift) %{
+ predicate(UseAVX > 0 && n->as_Vector()->length() == 2);
match(Set dst (URShiftVS src shift));
format %{ "vpsrlw $dst,$src,$shift\t! logical right shift packed2S" %}
ins_encode %{
@@ -9324,20 +8614,8 @@
ins_pipe( pipe_slow );
%}
-instruct vsrl2S_reg_evex_special(vecS dst, vecS src, vecS shift) %{
- predicate(VM_Version::supports_avx512nobw() && n->as_Vector()->length() == 2);
- match(Set dst (URShiftVS dst shift));
- effect(TEMP src);
- format %{ "vpsrlw $dst,$src,$shift\t! logical right shift packed2S" %}
- ins_encode %{
- int vector_len = 0;
- __ vpsrlw($dst$$XMMRegister, $src$$XMMRegister, $shift$$XMMRegister, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
-instruct vsrl2S_reg_imm_avx(vecS dst, vecS src, immI8 shift) %{
- predicate(VM_Version::supports_avxonly() && n->as_Vector()->length() == 2);
+instruct vsrl2S_reg_imm(vecS dst, vecS src, immI8 shift) %{
+ predicate(UseAVX > 0 && n->as_Vector()->length() == 2);
match(Set dst (URShiftVS src shift));
format %{ "vpsrlw $dst,$src,$shift\t! logical right shift packed2S" %}
ins_encode %{
@@ -9347,29 +8625,6 @@
ins_pipe( pipe_slow );
%}
-instruct vsrl2S_reg_imm_evex(vecS dst, vecS src, immI8 shift) %{
- predicate(VM_Version::supports_avx512bw() && n->as_Vector()->length() == 2);
- match(Set dst (URShiftVS src shift));
- format %{ "vpsrlw $dst,$src,$shift\t! logical right shift packed2S" %}
- ins_encode %{
- int vector_len = 0;
- __ vpsrlw($dst$$XMMRegister, $src$$XMMRegister, (int)$shift$$constant, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
-instruct vsrl2S_reg_imm_evex_special(vecS dst, vecS src, immI8 shift) %{
- predicate(VM_Version::supports_avx512nobw() && n->as_Vector()->length() == 2);
- match(Set dst (URShiftVS dst shift));
- effect(TEMP src);
- format %{ "vpsrlw $dst,$src,$shift\t! logical right shift packed2S" %}
- ins_encode %{
- int vector_len = 0;
- __ vpsrlw($dst$$XMMRegister, $src$$XMMRegister, (int)$shift$$constant, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
instruct vsrl4S(vecD dst, vecS shift) %{
predicate(UseAVX == 0 && n->as_Vector()->length() == 4);
match(Set dst (URShiftVS dst shift));
@@ -9390,19 +8645,8 @@
ins_pipe( pipe_slow );
%}
-instruct vsrl4S_reg_avx(vecD dst, vecD src, vecS shift) %{
- predicate(VM_Version::supports_avxonly() && n->as_Vector()->length() == 4);
- match(Set dst (URShiftVS src shift));
- format %{ "vpsrlw $dst,$src,$shift\t! logical right shift packed4S" %}
- ins_encode %{
- int vector_len = 0;
- __ vpsrlw($dst$$XMMRegister, $src$$XMMRegister, $shift$$XMMRegister, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
-instruct vsrl4S_reg_evex(vecD dst, vecD src, vecS shift) %{
- predicate(VM_Version::supports_avx512bw() && n->as_Vector()->length() == 4);
+instruct vsrl4S_reg(vecD dst, vecD src, vecS shift) %{
+ predicate(UseAVX > 0 && n->as_Vector()->length() == 4);
match(Set dst (URShiftVS src shift));
format %{ "vpsrlw $dst,$src,$shift\t! logical right shift packed4S" %}
ins_encode %{
@@ -9412,20 +8656,8 @@
ins_pipe( pipe_slow );
%}
-instruct vsrl4S_reg_evex_special(vecD dst, vecD src, vecS shift) %{
- predicate(VM_Version::supports_avx512nobw() && n->as_Vector()->length() == 4);
- match(Set dst (URShiftVS dst shift));
- effect(TEMP src);
- format %{ "vpsrlw $dst,$src,$shift\t! logical right shift packed4S" %}
- ins_encode %{
- int vector_len = 0;
- __ vpsrlw($dst$$XMMRegister, $src$$XMMRegister, $shift$$XMMRegister, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
-instruct vsrl4S_reg_imm_avx(vecD dst, vecD src, immI8 shift) %{
- predicate(VM_Version::supports_avxonly() && n->as_Vector()->length() == 4);
+instruct vsrl4S_reg_imm(vecD dst, vecD src, immI8 shift) %{
+ predicate(UseAVX > 0 && n->as_Vector()->length() == 4);
match(Set dst (URShiftVS src shift));
format %{ "vpsrlw $dst,$src,$shift\t! logical right shift packed4S" %}
ins_encode %{
@@ -9435,29 +8667,6 @@
ins_pipe( pipe_slow );
%}
-instruct vsrl4S_reg_imm_evex(vecD dst, vecD src, immI8 shift) %{
- predicate(VM_Version::supports_avx512bw() && n->as_Vector()->length() == 4);
- match(Set dst (URShiftVS src shift));
- format %{ "vpsrlw $dst,$src,$shift\t! logical right shift packed4S" %}
- ins_encode %{
- int vector_len = 0;
- __ vpsrlw($dst$$XMMRegister, $src$$XMMRegister, (int)$shift$$constant, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
-instruct vsrl4S_reg_imm_evex_special(vecD dst, vecD src, immI8 shift) %{
- predicate(VM_Version::supports_avx512nobw() && n->as_Vector()->length() == 4);
- match(Set dst (URShiftVS dst shift));
- effect(TEMP src);
- format %{ "vpsrlw $dst,$src,$shift\t! logical right shift packed4S" %}
- ins_encode %{
- int vector_len = 0;
- __ vpsrlw($dst$$XMMRegister, $src$$XMMRegister, (int)$shift$$constant, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
instruct vsrl8S(vecX dst, vecS shift) %{
predicate(UseAVX == 0 && n->as_Vector()->length() == 8);
match(Set dst (URShiftVS dst shift));
@@ -9478,19 +8687,8 @@
ins_pipe( pipe_slow );
%}
-instruct vsrl8S_reg_avx(vecX dst, vecX src, vecS shift) %{
- predicate(VM_Version::supports_avxonly() && n->as_Vector()->length() == 8);
- match(Set dst (URShiftVS src shift));
- format %{ "vpsrlw $dst,$src,$shift\t! logical right shift packed8S" %}
- ins_encode %{
- int vector_len = 0;
- __ vpsrlw($dst$$XMMRegister, $src$$XMMRegister, $shift$$XMMRegister, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
-instruct vsrl8S_reg_evex(vecX dst, vecX src, vecS shift) %{
- predicate(VM_Version::supports_avx512bw() && n->as_Vector()->length() == 8);
+instruct vsrl8S_reg(vecX dst, vecX src, vecS shift) %{
+ predicate(UseAVX > 0 && n->as_Vector()->length() == 8);
match(Set dst (URShiftVS src shift));
format %{ "vpsrlw $dst,$src,$shift\t! logical right shift packed8S" %}
ins_encode %{
@@ -9500,31 +8698,8 @@
ins_pipe( pipe_slow );
%}
-instruct vsrl8S_reg_evex_special(vecX dst, vecX src, vecS shift) %{
- predicate(VM_Version::supports_avx512nobw() && n->as_Vector()->length() == 8);
- match(Set dst (URShiftVS dst shift));
- effect(TEMP src);
- format %{ "vpsrlw $dst,$src,$shift\t! logical right shift packed8S" %}
- ins_encode %{
- int vector_len = 0;
- __ vpsrlw($dst$$XMMRegister, $src$$XMMRegister, $shift$$XMMRegister, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
-instruct vsrl8S_reg_imm_avx(vecX dst, vecX src, immI8 shift) %{
- predicate(VM_Version::supports_avxonly() && n->as_Vector()->length() == 8);
- match(Set dst (URShiftVS src shift));
- format %{ "vpsrlw $dst,$src,$shift\t! logical right shift packed8S" %}
- ins_encode %{
- int vector_len = 0;
- __ vpsrlw($dst$$XMMRegister, $src$$XMMRegister, (int)$shift$$constant, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
-instruct vsrl8S_reg_imm_evex(vecX dst, vecX src, immI8 shift) %{
- predicate(VM_Version::supports_avx512bw() && n->as_Vector()->length() == 8);
+instruct vsrl8S_reg_imm(vecX dst, vecX src, immI8 shift) %{
+ predicate(UseAVX > 0 && n->as_Vector()->length() == 8);
match(Set dst (URShiftVS src shift));
format %{ "vpsrlw $dst,$src,$shift\t! logical right shift packed8S" %}
ins_encode %{
@@ -9534,31 +8709,8 @@
ins_pipe( pipe_slow );
%}
-instruct vsrl8S_reg_imm_evex_special(vecX dst, vecX src, immI8 shift) %{
- predicate(VM_Version::supports_avx512nobw() && n->as_Vector()->length() == 8);
- match(Set dst (URShiftVS dst shift));
- effect(TEMP src);
- format %{ "vpsrlw $dst,$src,$shift\t! logical right shift packed8S" %}
- ins_encode %{
- int vector_len = 0;
- __ vpsrlw($dst$$XMMRegister, $src$$XMMRegister, (int)$shift$$constant, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
-instruct vsrl16S_reg_avx(vecY dst, vecY src, vecS shift) %{
- predicate(VM_Version::supports_avx256only() && n->as_Vector()->length() == 16);
- match(Set dst (URShiftVS src shift));
- format %{ "vpsrlw $dst,$src,$shift\t! logical right shift packed16S" %}
- ins_encode %{
- int vector_len = 1;
- __ vpsrlw($dst$$XMMRegister, $src$$XMMRegister, $shift$$XMMRegister, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
-instruct vsrl16S_reg_evex(vecY dst, vecY src, vecS shift) %{
- predicate(VM_Version::supports_avx512bw() && n->as_Vector()->length() == 16);
+instruct vsrl16S_reg(vecY dst, vecY src, vecS shift) %{
+ predicate(UseAVX > 1 && n->as_Vector()->length() == 16);
match(Set dst (URShiftVS src shift));
format %{ "vpsrlw $dst,$src,$shift\t! logical right shift packed16S" %}
ins_encode %{
@@ -9568,20 +8720,8 @@
ins_pipe( pipe_slow );
%}
-instruct vsrl16S_reg_evex_special(vecY dst, vecY src, vecS shift) %{
- predicate(VM_Version::supports_avx512nobw() && n->as_Vector()->length() == 16);
- match(Set dst (URShiftVS dst shift));
- effect(TEMP src);
- format %{ "vpsrlw $dst,$src,$shift\t! logical right shift packed16S" %}
- ins_encode %{
- int vector_len = 1;
- __ vpsrlw($dst$$XMMRegister, $src$$XMMRegister, $shift$$XMMRegister, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
-instruct vsrl16S_reg_imm_avx(vecY dst, vecY src, immI8 shift) %{
- predicate(VM_Version::supports_avx256only() && n->as_Vector()->length() == 16);
+instruct vsrl16S_reg_imm(vecY dst, vecY src, immI8 shift) %{
+ predicate(UseAVX > 1 && n->as_Vector()->length() == 16);
match(Set dst (URShiftVS src shift));
format %{ "vpsrlw $dst,$src,$shift\t! logical right shift packed16S" %}
ins_encode %{
@@ -9591,31 +8731,8 @@
ins_pipe( pipe_slow );
%}
-instruct vsrl16S_reg_imm_evex(vecY dst, vecY src, immI8 shift) %{
- predicate(VM_Version::supports_avx512bw() && n->as_Vector()->length() == 16);
- match(Set dst (URShiftVS src shift));
- format %{ "vpsrlw $dst,$src,$shift\t! logical right shift packed16S" %}
- ins_encode %{
- int vector_len = 1;
- __ vpsrlw($dst$$XMMRegister, $src$$XMMRegister, (int)$shift$$constant, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
-instruct vsrl16S_reg_imm_evex_special(vecY dst, vecY src, immI8 shift) %{
- predicate(VM_Version::supports_avx512nobw() && n->as_Vector()->length() == 16);
- match(Set dst (URShiftVS dst shift));
- effect(TEMP src);
- format %{ "vpsrlw $dst,$src,$shift\t! logical right shift packed16S" %}
- ins_encode %{
- int vector_len = 1;
- __ vpsrlw($dst$$XMMRegister, $src$$XMMRegister, (int)$shift$$constant, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
instruct vsrl32S_reg(vecZ dst, vecZ src, vecS shift) %{
- predicate(VM_Version::supports_avx512bw() && n->as_Vector()->length() == 32);
+ predicate(UseAVX > 2 && VM_Version::supports_avx512bw() && n->as_Vector()->length() == 32);
match(Set dst (URShiftVS src shift));
format %{ "vpsrlw $dst,$src,$shift\t! logical right shift packed32S" %}
ins_encode %{
@@ -9626,7 +8743,7 @@
%}
instruct vsrl32S_reg_imm(vecZ dst, vecZ src, immI8 shift) %{
- predicate(VM_Version::supports_avx512bw() && n->as_Vector()->length() == 32);
+ predicate(UseAVX > 2 && VM_Version::supports_avx512bw() && n->as_Vector()->length() == 32);
match(Set dst (URShiftVS src shift));
format %{ "vpsrlw $dst,$src,$shift\t! logical right shift packed32S" %}
ins_encode %{
@@ -9638,7 +8755,7 @@
// Integers vector logical right shift
instruct vsrl2I(vecD dst, vecS shift) %{
- predicate(n->as_Vector()->length() == 2);
+ predicate(UseAVX == 0 && n->as_Vector()->length() == 2);
match(Set dst (URShiftVI dst shift));
format %{ "psrld $dst,$shift\t! logical right shift packed2I" %}
ins_encode %{
@@ -9648,7 +8765,7 @@
%}
instruct vsrl2I_imm(vecD dst, immI8 shift) %{
- predicate(n->as_Vector()->length() == 2);
+ predicate(UseAVX == 0 && n->as_Vector()->length() == 2);
match(Set dst (URShiftVI dst shift));
format %{ "psrld $dst,$shift\t! logical right shift packed2I" %}
ins_encode %{
@@ -9680,7 +8797,7 @@
%}
instruct vsrl4I(vecX dst, vecS shift) %{
- predicate(n->as_Vector()->length() == 4);
+ predicate(UseAVX == 0 && n->as_Vector()->length() == 4);
match(Set dst (URShiftVI dst shift));
format %{ "psrld $dst,$shift\t! logical right shift packed4I" %}
ins_encode %{
@@ -9690,7 +8807,7 @@
%}
instruct vsrl4I_imm(vecX dst, immI8 shift) %{
- predicate(n->as_Vector()->length() == 4);
+ predicate(UseAVX == 0 && n->as_Vector()->length() == 4);
match(Set dst (URShiftVI dst shift));
format %{ "psrld $dst,$shift\t! logical right shift packed4I" %}
ins_encode %{
@@ -9767,7 +8884,7 @@
// Longs vector logical right shift
instruct vsrl2L(vecX dst, vecS shift) %{
- predicate(n->as_Vector()->length() == 2);
+ predicate(UseAVX == 0 && n->as_Vector()->length() == 2);
match(Set dst (URShiftVL dst shift));
format %{ "psrlq $dst,$shift\t! logical right shift packed2L" %}
ins_encode %{
@@ -9777,7 +8894,7 @@
%}
instruct vsrl2L_imm(vecX dst, immI8 shift) %{
- predicate(n->as_Vector()->length() == 2);
+ predicate(UseAVX == 0 && n->as_Vector()->length() == 2);
match(Set dst (URShiftVL dst shift));
format %{ "psrlq $dst,$shift\t! logical right shift packed2L" %}
ins_encode %{
@@ -9866,7 +8983,7 @@
%}
instruct vsra2S_imm(vecS dst, immI8 shift) %{
- predicate(n->as_Vector()->length() == 2);
+ predicate(UseAVX == 0 && n->as_Vector()->length() == 2);
match(Set dst (RShiftVS dst shift));
format %{ "psraw $dst,$shift\t! arithmetic right shift packed2S" %}
ins_encode %{
@@ -9875,19 +8992,8 @@
ins_pipe( pipe_slow );
%}
-instruct vsra2S_reg_avx(vecS dst, vecS src, vecS shift) %{
- predicate(VM_Version::supports_avxonly() && n->as_Vector()->length() == 2);
- match(Set dst (RShiftVS src shift));
- format %{ "vpsraw $dst,$src,$shift\t! arithmetic right shift packed2S" %}
- ins_encode %{
- int vector_len = 0;
- __ vpsraw($dst$$XMMRegister, $src$$XMMRegister, $shift$$XMMRegister, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
-instruct vsra2S_reg_evex(vecS dst, vecS src, vecS shift) %{
- predicate(VM_Version::supports_avx512bw() && n->as_Vector()->length() == 2);
+instruct vsra2S_reg(vecS dst, vecS src, vecS shift) %{
+ predicate(UseAVX > 0 && n->as_Vector()->length() == 2);
match(Set dst (RShiftVS src shift));
format %{ "vpsraw $dst,$src,$shift\t! arithmetic right shift packed2S" %}
ins_encode %{
@@ -9897,20 +9003,8 @@
ins_pipe( pipe_slow );
%}
-instruct vsra2S_reg_evex_special(vecS dst, vecS src, vecS shift) %{
- predicate(VM_Version::supports_avx512nobw() && n->as_Vector()->length() == 2);
- match(Set dst (RShiftVS dst shift));
- effect(TEMP src);
- format %{ "vpsraw $dst,$src,$shift\t! arithmetic right shift packed2S" %}
- ins_encode %{
- int vector_len = 0;
- __ vpsraw($dst$$XMMRegister, $src$$XMMRegister, $shift$$XMMRegister, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
-instruct vsra2S_reg_imm_avx(vecS dst, vecS src, immI8 shift) %{
- predicate(VM_Version::supports_avxonly() && n->as_Vector()->length() == 2);
+instruct vsra2S_reg_imm(vecS dst, vecS src, immI8 shift) %{
+ predicate(UseAVX > 0 && n->as_Vector()->length() == 2);
match(Set dst (RShiftVS src shift));
format %{ "vpsraw $dst,$src,$shift\t! arithmetic right shift packed2S" %}
ins_encode %{
@@ -9920,29 +9014,6 @@
ins_pipe( pipe_slow );
%}
-instruct vsra2S_reg_imm_evex(vecS dst, vecS src, immI8 shift) %{
- predicate(VM_Version::supports_avx512bw() && n->as_Vector()->length() == 2);
- match(Set dst (RShiftVS src shift));
- format %{ "vpsraw $dst,$src,$shift\t! arithmetic right shift packed2S" %}
- ins_encode %{
- int vector_len = 0;
- __ vpsraw($dst$$XMMRegister, $src$$XMMRegister, (int)$shift$$constant, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
-instruct vsra2S_reg_imm_evex_special(vecS dst, vecS src, immI8 shift) %{
- predicate(VM_Version::supports_avx512nobw() && n->as_Vector()->length() == 2);
- match(Set dst (RShiftVS dst shift));
- effect(TEMP src);
- format %{ "vpsraw $dst,$src,$shift\t! arithmetic right shift packed2S" %}
- ins_encode %{
- int vector_len = 0;
- __ vpsraw($dst$$XMMRegister, $src$$XMMRegister, (int)$shift$$constant, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
instruct vsra4S(vecD dst, vecS shift) %{
predicate(UseAVX == 0 && n->as_Vector()->length() == 4);
match(Set dst (RShiftVS dst shift));
@@ -9963,19 +9034,8 @@
ins_pipe( pipe_slow );
%}
-instruct vsra4S_reg_avx(vecD dst, vecD src, vecS shift) %{
- predicate(VM_Version::supports_avxonly() && n->as_Vector()->length() == 4);
- match(Set dst (RShiftVS src shift));
- format %{ "vpsraw $dst,$src,$shift\t! arithmetic right shift packed4S" %}
- ins_encode %{
- int vector_len = 0;
- __ vpsraw($dst$$XMMRegister, $src$$XMMRegister, $shift$$XMMRegister, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
-instruct vsra4S_reg_evex(vecD dst, vecD src, vecS shift) %{
- predicate(VM_Version::supports_avx512bw() && n->as_Vector()->length() == 4);
+instruct vsra4S_reg(vecD dst, vecD src, vecS shift) %{
+ predicate(UseAVX > 0 && n->as_Vector()->length() == 4);
match(Set dst (RShiftVS src shift));
format %{ "vpsraw $dst,$src,$shift\t! arithmetic right shift packed4S" %}
ins_encode %{
@@ -9985,20 +9045,8 @@
ins_pipe( pipe_slow );
%}
-instruct vsra4S_reg_evex_special(vecD dst, vecD src, vecS shift) %{
- predicate(VM_Version::supports_avx512nobw() && n->as_Vector()->length() == 4);
- match(Set dst (RShiftVS dst shift));
- effect(TEMP src);
- format %{ "vpsraw $dst,$src,$shift\t! arithmetic right shift packed4S" %}
- ins_encode %{
- int vector_len = 0;
- __ vpsraw($dst$$XMMRegister, $src$$XMMRegister, $shift$$XMMRegister, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
-instruct vsra4S_reg_imm_avx(vecD dst, vecD src, immI8 shift) %{
- predicate(VM_Version::supports_avxonly() && n->as_Vector()->length() == 4);
+instruct vsra4S_reg_imm(vecD dst, vecD src, immI8 shift) %{
+ predicate(UseAVX > 0 && n->as_Vector()->length() == 4);
match(Set dst (RShiftVS src shift));
format %{ "vpsraw $dst,$src,$shift\t! arithmetic right shift packed4S" %}
ins_encode %{
@@ -10008,29 +9056,6 @@
ins_pipe( pipe_slow );
%}
-instruct vsra4S_reg_imm_evex(vecD dst, vecD src, immI8 shift) %{
- predicate(VM_Version::supports_avx512bw() && n->as_Vector()->length() == 4);
- match(Set dst (RShiftVS src shift));
- format %{ "vpsraw $dst,$src,$shift\t! arithmetic right shift packed4S" %}
- ins_encode %{
- int vector_len = 0;
- __ vpsraw($dst$$XMMRegister, $src$$XMMRegister, (int)$shift$$constant, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
-instruct vsra4S_reg_imm_evex_special(vecD dst, vecD src, immI8 shift) %{
- predicate(VM_Version::supports_avx512nobw() && n->as_Vector()->length() == 4);
- match(Set dst (RShiftVS dst shift));
- effect(TEMP src);
- format %{ "vpsraw $dst,$src,$shift\t! arithmetic right shift packed4S" %}
- ins_encode %{
- int vector_len = 0;
- __ vpsraw($dst$$XMMRegister, $src$$XMMRegister, (int)$shift$$constant, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
instruct vsra8S(vecX dst, vecS shift) %{
predicate(UseAVX == 0 && n->as_Vector()->length() == 8);
match(Set dst (RShiftVS dst shift));
@@ -10051,19 +9076,8 @@
ins_pipe( pipe_slow );
%}
-instruct vsra8S_reg_avx(vecX dst, vecX src, vecS shift) %{
- predicate(VM_Version::supports_avxonly() && n->as_Vector()->length() == 8);
- match(Set dst (RShiftVS src shift));
- format %{ "vpsraw $dst,$src,$shift\t! arithmetic right shift packed8S" %}
- ins_encode %{
- int vector_len = 0;
- __ vpsraw($dst$$XMMRegister, $src$$XMMRegister, $shift$$XMMRegister, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
-instruct vsra8S_reg_evex(vecX dst, vecX src, vecS shift) %{
- predicate(VM_Version::supports_avx512bw() && n->as_Vector()->length() == 8);
+instruct vsra8S_reg(vecX dst, vecX src, vecS shift) %{
+ predicate(UseAVX > 0 && n->as_Vector()->length() == 8);
match(Set dst (RShiftVS src shift));
format %{ "vpsraw $dst,$src,$shift\t! arithmetic right shift packed8S" %}
ins_encode %{
@@ -10073,31 +9087,8 @@
ins_pipe( pipe_slow );
%}
-instruct vsra8S_reg_evex_special(vecX dst, vecX src, vecS shift) %{
- predicate(VM_Version::supports_avx512nobw() && n->as_Vector()->length() == 8);
- match(Set dst (RShiftVS dst shift));
- effect(TEMP src);
- format %{ "vpsraw $dst,$src,$shift\t! arithmetic right shift packed8S" %}
- ins_encode %{
- int vector_len = 0;
- __ vpsraw($dst$$XMMRegister, $src$$XMMRegister, $shift$$XMMRegister, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
-instruct vsra8S_reg_imm_avx(vecX dst, vecX src, immI8 shift) %{
- predicate(VM_Version::supports_avxonly() && n->as_Vector()->length() == 8);
- match(Set dst (RShiftVS src shift));
- format %{ "vpsraw $dst,$src,$shift\t! arithmetic right shift packed8S" %}
- ins_encode %{
- int vector_len = 0;
- __ vpsraw($dst$$XMMRegister, $src$$XMMRegister, (int)$shift$$constant, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
-instruct vsra8S_reg_imm_evex(vecX dst, vecX src, immI8 shift) %{
- predicate(VM_Version::supports_avx512bw() && n->as_Vector()->length() == 8);
+instruct vsra8S_reg_imm(vecX dst, vecX src, immI8 shift) %{
+ predicate(UseAVX > 0 && n->as_Vector()->length() == 8);
match(Set dst (RShiftVS src shift));
format %{ "vpsraw $dst,$src,$shift\t! arithmetic right shift packed8S" %}
ins_encode %{
@@ -10107,31 +9098,8 @@
ins_pipe( pipe_slow );
%}
-instruct vsra8S_reg_imm_evex_special(vecX dst, vecX src, immI8 shift) %{
- predicate(VM_Version::supports_avx512nobw() && n->as_Vector()->length() == 8);
- match(Set dst (RShiftVS dst shift));
- effect(TEMP src);
- format %{ "vpsraw $dst,$src,$shift\t! arithmetic right shift packed8S" %}
- ins_encode %{
- int vector_len = 0;
- __ vpsraw($dst$$XMMRegister, $src$$XMMRegister, (int)$shift$$constant, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
-instruct vsra16S_reg_avx(vecY dst, vecY src, vecS shift) %{
- predicate(VM_Version::supports_avx256only() && n->as_Vector()->length() == 16);
- match(Set dst (RShiftVS src shift));
- format %{ "vpsraw $dst,$src,$shift\t! arithmetic right shift packed16S" %}
- ins_encode %{
- int vector_len = 1;
- __ vpsraw($dst$$XMMRegister, $src$$XMMRegister, $shift$$XMMRegister, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
-instruct vsra16S_reg_evex(vecY dst, vecY src, vecS shift) %{
- predicate(VM_Version::supports_avx512bw() && n->as_Vector()->length() == 16);
+instruct vsra16S_reg(vecY dst, vecY src, vecS shift) %{
+ predicate(UseAVX > 1 && n->as_Vector()->length() == 16);
match(Set dst (RShiftVS src shift));
format %{ "vpsraw $dst,$src,$shift\t! arithmetic right shift packed16S" %}
ins_encode %{
@@ -10141,20 +9109,8 @@
ins_pipe( pipe_slow );
%}
-instruct vsra16S_reg_evex_special(vecY dst, vecY src, vecS shift) %{
- predicate(VM_Version::supports_avx512nobw() && n->as_Vector()->length() == 16);
- match(Set dst (RShiftVS dst shift));
- effect(TEMP src);
- format %{ "vpsraw $dst,$src,$shift\t! arithmetic right shift packed16S" %}
- ins_encode %{
- int vector_len = 1;
- __ vpsraw($dst$$XMMRegister, $src$$XMMRegister, $shift$$XMMRegister, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
-instruct vsra16S_reg_imm_avx(vecY dst, vecY src, immI8 shift) %{
- predicate(VM_Version::supports_avxonly() && n->as_Vector()->length() == 16);
+instruct vsra16S_reg_imm(vecY dst, vecY src, immI8 shift) %{
+ predicate(UseAVX > 1 && n->as_Vector()->length() == 16);
match(Set dst (RShiftVS src shift));
format %{ "vpsraw $dst,$src,$shift\t! arithmetic right shift packed16S" %}
ins_encode %{
@@ -10164,31 +9120,8 @@
ins_pipe( pipe_slow );
%}
-instruct vsra16S_reg_imm_evex(vecY dst, vecY src, immI8 shift) %{
- predicate(VM_Version::supports_avx512bw() && n->as_Vector()->length() == 16);
- match(Set dst (RShiftVS src shift));
- format %{ "vpsraw $dst,$src,$shift\t! arithmetic right shift packed16S" %}
- ins_encode %{
- int vector_len = 1;
- __ vpsraw($dst$$XMMRegister, $src$$XMMRegister, (int)$shift$$constant, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
-instruct vsra16S_reg_imm_evex_special(vecY dst, vecY src, immI8 shift) %{
- predicate(VM_Version::supports_avx512nobw() && n->as_Vector()->length() == 16);
- match(Set dst (RShiftVS dst shift));
- effect(TEMP src);
- format %{ "vpsraw $dst,$src,$shift\t! arithmetic right shift packed16S" %}
- ins_encode %{
- int vector_len = 1;
- __ vpsraw($dst$$XMMRegister, $src$$XMMRegister, (int)$shift$$constant, vector_len);
- %}
- ins_pipe( pipe_slow );
-%}
-
instruct vsra32S_reg(vecZ dst, vecZ src, vecS shift) %{
- predicate(VM_Version::supports_avx512bw() && n->as_Vector()->length() == 32);
+ predicate(UseAVX > 2 && VM_Version::supports_avx512bw() && n->as_Vector()->length() == 32);
match(Set dst (RShiftVS src shift));
format %{ "vpsraw $dst,$src,$shift\t! arithmetic right shift packed32S" %}
ins_encode %{
@@ -10199,7 +9132,7 @@
%}
instruct vsra32S_reg_imm(vecZ dst, vecZ src, immI8 shift) %{
- predicate(VM_Version::supports_avx512bw() && n->as_Vector()->length() == 32);
+ predicate(UseAVX > 2 && VM_Version::supports_avx512bw() && n->as_Vector()->length() == 32);
match(Set dst (RShiftVS src shift));
format %{ "vpsraw $dst,$src,$shift\t! arithmetic right shift packed32S" %}
ins_encode %{
@@ -10211,7 +9144,7 @@
// Integers vector arithmetic right shift
instruct vsra2I(vecD dst, vecS shift) %{
- predicate(n->as_Vector()->length() == 2);
+ predicate(UseAVX == 0 && n->as_Vector()->length() == 2);
match(Set dst (RShiftVI dst shift));
format %{ "psrad $dst,$shift\t! arithmetic right shift packed2I" %}
ins_encode %{
@@ -10221,7 +9154,7 @@
%}
instruct vsra2I_imm(vecD dst, immI8 shift) %{
- predicate(n->as_Vector()->length() == 2);
+ predicate(UseAVX == 0 && n->as_Vector()->length() == 2);
match(Set dst (RShiftVI dst shift));
format %{ "psrad $dst,$shift\t! arithmetic right shift packed2I" %}
ins_encode %{
@@ -10253,7 +9186,7 @@
%}
instruct vsra4I(vecX dst, vecS shift) %{
- predicate(n->as_Vector()->length() == 4);
+ predicate(UseAVX == 0 && n->as_Vector()->length() == 4);
match(Set dst (RShiftVI dst shift));
format %{ "psrad $dst,$shift\t! arithmetic right shift packed4I" %}
ins_encode %{
@@ -10263,7 +9196,7 @@
%}
instruct vsra4I_imm(vecX dst, immI8 shift) %{
- predicate(n->as_Vector()->length() == 4);
+ predicate(UseAVX == 0 && n->as_Vector()->length() == 4);
match(Set dst (RShiftVI dst shift));
format %{ "psrad $dst,$shift\t! arithmetic right shift packed4I" %}
ins_encode %{
@@ -10344,7 +9277,7 @@
// --------------------------------- AND --------------------------------------
instruct vand4B(vecS dst, vecS src) %{
- predicate(n->as_Vector()->length_in_bytes() == 4);
+ predicate(UseAVX == 0 && n->as_Vector()->length_in_bytes() == 4);
match(Set dst (AndV dst src));
format %{ "pand $dst,$src\t! and vectors (4 bytes)" %}
ins_encode %{
@@ -10376,7 +9309,7 @@
%}
instruct vand8B(vecD dst, vecD src) %{
- predicate(n->as_Vector()->length_in_bytes() == 8);
+ predicate(UseAVX == 0 && n->as_Vector()->length_in_bytes() == 8);
match(Set dst (AndV dst src));
format %{ "pand $dst,$src\t! and vectors (8 bytes)" %}
ins_encode %{
@@ -10408,7 +9341,7 @@
%}
instruct vand16B(vecX dst, vecX src) %{
- predicate(n->as_Vector()->length_in_bytes() == 16);
+ predicate(UseAVX == 0 && n->as_Vector()->length_in_bytes() == 16);
match(Set dst (AndV dst src));
format %{ "pand $dst,$src\t! and vectors (16 bytes)" %}
ins_encode %{
@@ -10486,7 +9419,7 @@
// --------------------------------- OR ---------------------------------------
instruct vor4B(vecS dst, vecS src) %{
- predicate(n->as_Vector()->length_in_bytes() == 4);
+ predicate(UseAVX == 0 && n->as_Vector()->length_in_bytes() == 4);
match(Set dst (OrV dst src));
format %{ "por $dst,$src\t! or vectors (4 bytes)" %}
ins_encode %{
@@ -10518,7 +9451,7 @@
%}
instruct vor8B(vecD dst, vecD src) %{
- predicate(n->as_Vector()->length_in_bytes() == 8);
+ predicate(UseAVX == 0 && n->as_Vector()->length_in_bytes() == 8);
match(Set dst (OrV dst src));
format %{ "por $dst,$src\t! or vectors (8 bytes)" %}
ins_encode %{
@@ -10550,7 +9483,7 @@
%}
instruct vor16B(vecX dst, vecX src) %{
- predicate(n->as_Vector()->length_in_bytes() == 16);
+ predicate(UseAVX == 0 && n->as_Vector()->length_in_bytes() == 16);
match(Set dst (OrV dst src));
format %{ "por $dst,$src\t! or vectors (16 bytes)" %}
ins_encode %{
@@ -10628,7 +9561,7 @@
// --------------------------------- XOR --------------------------------------
instruct vxor4B(vecS dst, vecS src) %{
- predicate(n->as_Vector()->length_in_bytes() == 4);
+ predicate(UseAVX == 0 && n->as_Vector()->length_in_bytes() == 4);
match(Set dst (XorV dst src));
format %{ "pxor $dst,$src\t! xor vectors (4 bytes)" %}
ins_encode %{
@@ -10660,7 +9593,7 @@
%}
instruct vxor8B(vecD dst, vecD src) %{
- predicate(n->as_Vector()->length_in_bytes() == 8);
+ predicate(UseAVX == 0 && n->as_Vector()->length_in_bytes() == 8);
match(Set dst (XorV dst src));
format %{ "pxor $dst,$src\t! xor vectors (8 bytes)" %}
ins_encode %{
@@ -10692,7 +9625,7 @@
%}
instruct vxor16B(vecX dst, vecX src) %{
- predicate(n->as_Vector()->length_in_bytes() == 16);
+ predicate(UseAVX == 0 && n->as_Vector()->length_in_bytes() == 16);
match(Set dst (XorV dst src));
format %{ "pxor $dst,$src\t! xor vectors (16 bytes)" %}
ins_encode %{
--- a/src/hotspot/cpu/x86/x86_32.ad Wed Sep 26 18:36:55 2018 +0100
+++ b/src/hotspot/cpu/x86/x86_32.ad Thu Sep 27 10:49:10 2018 -0700
@@ -4101,6 +4101,15 @@
interface(REG_INTER);
%}
+// Float register operands
+operand vlRegF() %{
+ constraint(ALLOC_IN_RC(float_reg_vl));
+ match(RegF);
+
+ format %{ %}
+ interface(REG_INTER);
+%}
+
// XMM Double register operands
operand regD() %{
predicate( UseSSE>=2 );
@@ -4110,6 +4119,15 @@
interface(REG_INTER);
%}
+// Double register operands
+operand vlRegD() %{
+ constraint(ALLOC_IN_RC(double_reg_vl));
+ match(RegD);
+
+ format %{ %}
+ interface(REG_INTER);
+%}
+
// Vectors : note, we use legacy registers to avoid extra (unneeded in 32-bit VM)
// runtime code generation via reg_class_dynamic.
operand vecS() %{
@@ -4120,6 +4138,14 @@
interface(REG_INTER);
%}
+operand legVecS() %{
+ constraint(ALLOC_IN_RC(vectors_reg_legacy));
+ match(VecS);
+
+ format %{ %}
+ interface(REG_INTER);
+%}
+
operand vecD() %{
constraint(ALLOC_IN_RC(vectord_reg_legacy));
match(VecD);
@@ -4128,6 +4154,14 @@
interface(REG_INTER);
%}
+operand legVecD() %{
+ constraint(ALLOC_IN_RC(vectord_reg_legacy));
+ match(VecD);
+
+ format %{ %}
+ interface(REG_INTER);
+%}
+
operand vecX() %{
constraint(ALLOC_IN_RC(vectorx_reg_legacy));
match(VecX);
@@ -4136,6 +4170,14 @@
interface(REG_INTER);
%}
+operand legVecX() %{
+ constraint(ALLOC_IN_RC(vectorx_reg_legacy));
+ match(VecX);
+
+ format %{ %}
+ interface(REG_INTER);
+%}
+
operand vecY() %{
constraint(ALLOC_IN_RC(vectory_reg_legacy));
match(VecY);
@@ -4144,6 +4186,14 @@
interface(REG_INTER);
%}
+operand legVecY() %{
+ constraint(ALLOC_IN_RC(vectory_reg_legacy));
+ match(VecY);
+
+ format %{ %}
+ interface(REG_INTER);
+%}
+
//----------Memory Operands----------------------------------------------------
// Direct Memory Operand
operand direct(immP addr) %{
@@ -6515,6 +6565,26 @@
ins_pipe( pipe_slow );
%}
+// Load Double
+instruct MoveD2VL(vlRegD dst, regD src) %{
+ match(Set dst src);
+ format %{ "movsd $dst,$src\t! load double (8 bytes)" %}
+ ins_encode %{
+ __ movdbl($dst$$XMMRegister, $src$$XMMRegister);
+ %}
+ ins_pipe( fpu_reg_reg );
+%}
+
+// Load Double
+instruct MoveVL2D(regD dst, vlRegD src) %{
+ match(Set dst src);
+ format %{ "movsd $dst,$src\t! load double (8 bytes)" %}
+ ins_encode %{
+ __ movdbl($dst$$XMMRegister, $src$$XMMRegister);
+ %}
+ ins_pipe( fpu_reg_reg );
+%}
+
// Store XMM register to memory (single-precision floating point)
// MOVSS instruction
instruct storeF(memory mem, regF src) %{
@@ -6528,6 +6598,26 @@
ins_pipe( pipe_slow );
%}
+// Load Float
+instruct MoveF2VL(vlRegF dst, regF src) %{
+ match(Set dst src);
+ format %{ "movss $dst,$src\t! load float (4 bytes)" %}
+ ins_encode %{
+ __ movflt($dst$$XMMRegister, $src$$XMMRegister);
+ %}
+ ins_pipe( fpu_reg_reg );
+%}
+
+// Load Float
+instruct MoveVL2F(regF dst, vlRegF src) %{
+ match(Set dst src);
+ format %{ "movss $dst,$src\t! load float (4 bytes)" %}
+ ins_encode %{
+ __ movflt($dst$$XMMRegister, $src$$XMMRegister);
+ %}
+ ins_pipe( fpu_reg_reg );
+%}
+
// Store Float
instruct storeFPR( memory mem, regFPR1 src) %{
predicate(UseSSE==0);
--- a/src/hotspot/cpu/x86/x86_64.ad Wed Sep 26 18:36:55 2018 +0100
+++ b/src/hotspot/cpu/x86/x86_64.ad Thu Sep 27 10:49:10 2018 -0700
@@ -3656,6 +3656,15 @@
interface(REG_INTER);
%}
+// Float register operands
+operand vlRegF() %{
+ constraint(ALLOC_IN_RC(float_reg_vl));
+ match(RegF);
+
+ format %{ %}
+ interface(REG_INTER);
+%}
+
// Double register operands
operand regD() %{
constraint(ALLOC_IN_RC(double_reg));
@@ -3665,9 +3674,27 @@
interface(REG_INTER);
%}
+// Double register operands
+operand vlRegD() %{
+ constraint(ALLOC_IN_RC(double_reg_vl));
+ match(RegD);
+
+ format %{ %}
+ interface(REG_INTER);
+%}
+
// Vectors
operand vecS() %{
- constraint(ALLOC_IN_RC(vectors_reg));
+ constraint(ALLOC_IN_RC(vectors_reg_vlbwdq));
+ match(VecS);
+
+ format %{ %}
+ interface(REG_INTER);
+%}
+
+// Vectors
+operand legVecS() %{
+ constraint(ALLOC_IN_RC(vectors_reg_legacy));
match(VecS);
format %{ %}
@@ -3675,7 +3702,15 @@
%}
operand vecD() %{
- constraint(ALLOC_IN_RC(vectord_reg));
+ constraint(ALLOC_IN_RC(vectord_reg_vlbwdq));
+ match(VecD);
+
+ format %{ %}
+ interface(REG_INTER);
+%}
+
+operand legVecD() %{
+ constraint(ALLOC_IN_RC(vectord_reg_legacy));
match(VecD);
format %{ %}
@@ -3683,7 +3718,15 @@
%}
operand vecX() %{
- constraint(ALLOC_IN_RC(vectorx_reg));
+ constraint(ALLOC_IN_RC(vectorx_reg_vlbwdq));
+ match(VecX);
+
+ format %{ %}
+ interface(REG_INTER);
+%}
+
+operand legVecX() %{
+ constraint(ALLOC_IN_RC(vectorx_reg_legacy));
match(VecX);
format %{ %}
@@ -3691,7 +3734,15 @@
%}
operand vecY() %{
- constraint(ALLOC_IN_RC(vectory_reg));
+ constraint(ALLOC_IN_RC(vectory_reg_vlbwdq));
+ match(VecY);
+
+ format %{ %}
+ interface(REG_INTER);
+%}
+
+operand legVecY() %{
+ constraint(ALLOC_IN_RC(vectory_reg_legacy));
match(VecY);
format %{ %}
@@ -5287,6 +5338,26 @@
ins_pipe(pipe_slow); // XXX
%}
+// Load Float
+instruct MoveF2VL(vlRegF dst, regF src) %{
+ match(Set dst src);
+ format %{ "movss $dst,$src\t! load float (4 bytes)" %}
+ ins_encode %{
+ __ movflt($dst$$XMMRegister, $src$$XMMRegister);
+ %}
+ ins_pipe( fpu_reg_reg );
+%}
+
+// Load Float
+instruct MoveVL2F(regF dst, vlRegF src) %{
+ match(Set dst src);
+ format %{ "movss $dst,$src\t! load float (4 bytes)" %}
+ ins_encode %{
+ __ movflt($dst$$XMMRegister, $src$$XMMRegister);
+ %}
+ ins_pipe( fpu_reg_reg );
+%}
+
// Load Double
instruct loadD_partial(regD dst, memory mem)
%{
@@ -5314,6 +5385,26 @@
ins_pipe(pipe_slow); // XXX
%}
+// Load Double
+instruct MoveD2VL(vlRegD dst, regD src) %{
+ match(Set dst src);
+ format %{ "movsd $dst,$src\t! load double (8 bytes)" %}
+ ins_encode %{
+ __ movdbl($dst$$XMMRegister, $src$$XMMRegister);
+ %}
+ ins_pipe( fpu_reg_reg );
+%}
+
+// Load Double
+instruct MoveVL2D(regD dst, vlRegD src) %{
+ match(Set dst src);
+ format %{ "movsd $dst,$src\t! load double (8 bytes)" %}
+ ins_encode %{
+ __ movdbl($dst$$XMMRegister, $src$$XMMRegister);
+ %}
+ ins_pipe( fpu_reg_reg );
+%}
+
// Load Effective Address
instruct leaP8(rRegP dst, indOffset8 mem)
%{
@@ -10858,7 +10949,7 @@
%}
instruct string_compareL(rdi_RegP str1, rcx_RegI cnt1, rsi_RegP str2, rdx_RegI cnt2,
- rax_RegI result, regD tmp1, rFlagsReg cr)
+ rax_RegI result, legVecS tmp1, rFlagsReg cr)
%{
predicate(((StrCompNode*)n)->encoding() == StrIntrinsicNode::LL);
match(Set result (StrComp (Binary str1 cnt1) (Binary str2 cnt2)));
@@ -10874,7 +10965,7 @@
%}
instruct string_compareU(rdi_RegP str1, rcx_RegI cnt1, rsi_RegP str2, rdx_RegI cnt2,
- rax_RegI result, regD tmp1, rFlagsReg cr)
+ rax_RegI result, legVecS tmp1, rFlagsReg cr)
%{
predicate(((StrCompNode*)n)->encoding() == StrIntrinsicNode::UU);
match(Set result (StrComp (Binary str1 cnt1) (Binary str2 cnt2)));
@@ -10890,7 +10981,7 @@
%}
instruct string_compareLU(rdi_RegP str1, rcx_RegI cnt1, rsi_RegP str2, rdx_RegI cnt2,
- rax_RegI result, regD tmp1, rFlagsReg cr)
+ rax_RegI result, legVecS tmp1, rFlagsReg cr)
%{
predicate(((StrCompNode*)n)->encoding() == StrIntrinsicNode::LU);
match(Set result (StrComp (Binary str1 cnt1) (Binary str2 cnt2)));
@@ -10906,7 +10997,7 @@
%}
instruct string_compareUL(rsi_RegP str1, rdx_RegI cnt1, rdi_RegP str2, rcx_RegI cnt2,
- rax_RegI result, regD tmp1, rFlagsReg cr)
+ rax_RegI result, legVecS tmp1, rFlagsReg cr)
%{
predicate(((StrCompNode*)n)->encoding() == StrIntrinsicNode::UL);
match(Set result (StrComp (Binary str1 cnt1) (Binary str2 cnt2)));
@@ -10923,7 +11014,7 @@
// fast search of substring with known size.
instruct string_indexof_conL(rdi_RegP str1, rdx_RegI cnt1, rsi_RegP str2, immI int_cnt2,
- rbx_RegI result, regD vec, rax_RegI cnt2, rcx_RegI tmp, rFlagsReg cr)
+ rbx_RegI result, legVecS vec, rax_RegI cnt2, rcx_RegI tmp, rFlagsReg cr)
%{
predicate(UseSSE42Intrinsics && (((StrIndexOfNode*)n)->encoding() == StrIntrinsicNode::LL));
match(Set result (StrIndexOf (Binary str1 cnt1) (Binary str2 int_cnt2)));
@@ -10952,7 +11043,7 @@
// fast search of substring with known size.
instruct string_indexof_conU(rdi_RegP str1, rdx_RegI cnt1, rsi_RegP str2, immI int_cnt2,
- rbx_RegI result, regD vec, rax_RegI cnt2, rcx_RegI tmp, rFlagsReg cr)
+ rbx_RegI result, legVecS vec, rax_RegI cnt2, rcx_RegI tmp, rFlagsReg cr)
%{
predicate(UseSSE42Intrinsics && (((StrIndexOfNode*)n)->encoding() == StrIntrinsicNode::UU));
match(Set result (StrIndexOf (Binary str1 cnt1) (Binary str2 int_cnt2)));
@@ -10981,7 +11072,7 @@
// fast search of substring with known size.
instruct string_indexof_conUL(rdi_RegP str1, rdx_RegI cnt1, rsi_RegP str2, immI int_cnt2,
- rbx_RegI result, regD vec, rax_RegI cnt2, rcx_RegI tmp, rFlagsReg cr)
+ rbx_RegI result, legVecS vec, rax_RegI cnt2, rcx_RegI tmp, rFlagsReg cr)
%{
predicate(UseSSE42Intrinsics && (((StrIndexOfNode*)n)->encoding() == StrIntrinsicNode::UL));
match(Set result (StrIndexOf (Binary str1 cnt1) (Binary str2 int_cnt2)));
@@ -11009,7 +11100,7 @@
%}
instruct string_indexofL(rdi_RegP str1, rdx_RegI cnt1, rsi_RegP str2, rax_RegI cnt2,
- rbx_RegI result, regD vec, rcx_RegI tmp, rFlagsReg cr)
+ rbx_RegI result, legVecS vec, rcx_RegI tmp, rFlagsReg cr)
%{
predicate(UseSSE42Intrinsics && (((StrIndexOfNode*)n)->encoding() == StrIntrinsicNode::LL));
match(Set result (StrIndexOf (Binary str1 cnt1) (Binary str2 cnt2)));
@@ -11026,7 +11117,7 @@
%}
instruct string_indexofU(rdi_RegP str1, rdx_RegI cnt1, rsi_RegP str2, rax_RegI cnt2,
- rbx_RegI result, regD vec, rcx_RegI tmp, rFlagsReg cr)
+ rbx_RegI result, legVecS vec, rcx_RegI tmp, rFlagsReg cr)
%{
predicate(UseSSE42Intrinsics && (((StrIndexOfNode*)n)->encoding() == StrIntrinsicNode::UU));
match(Set result (StrIndexOf (Binary str1 cnt1) (Binary str2 cnt2)));
@@ -11043,7 +11134,7 @@
%}
instruct string_indexofUL(rdi_RegP str1, rdx_RegI cnt1, rsi_RegP str2, rax_RegI cnt2,
- rbx_RegI result, regD vec, rcx_RegI tmp, rFlagsReg cr)
+ rbx_RegI result, legVecS vec, rcx_RegI tmp, rFlagsReg cr)
%{
predicate(UseSSE42Intrinsics && (((StrIndexOfNode*)n)->encoding() == StrIntrinsicNode::UL));
match(Set result (StrIndexOf (Binary str1 cnt1) (Binary str2 cnt2)));
@@ -11060,7 +11151,7 @@
%}
instruct string_indexofU_char(rdi_RegP str1, rdx_RegI cnt1, rax_RegI ch,
- rbx_RegI result, regD vec1, regD vec2, regD vec3, rcx_RegI tmp, rFlagsReg cr)
+ rbx_RegI result, legVecS vec1, legVecS vec2, legVecS vec3, rcx_RegI tmp, rFlagsReg cr)
%{
predicate(UseSSE42Intrinsics);
match(Set result (StrIndexOfChar (Binary str1 cnt1) ch));
@@ -11075,7 +11166,7 @@
// fast string equals
instruct string_equals(rdi_RegP str1, rsi_RegP str2, rcx_RegI cnt, rax_RegI result,
- regD tmp1, regD tmp2, rbx_RegI tmp3, rFlagsReg cr)
+ legVecS tmp1, legVecS tmp2, rbx_RegI tmp3, rFlagsReg cr)
%{
match(Set result (StrEquals (Binary str1 str2) cnt));
effect(TEMP tmp1, TEMP tmp2, USE_KILL str1, USE_KILL str2, USE_KILL cnt, KILL tmp3, KILL cr);
@@ -11091,7 +11182,7 @@
// fast array equals
instruct array_equalsB(rdi_RegP ary1, rsi_RegP ary2, rax_RegI result,
- regD tmp1, regD tmp2, rcx_RegI tmp3, rbx_RegI tmp4, rFlagsReg cr)
+ legVecS tmp1, legVecS tmp2, rcx_RegI tmp3, rbx_RegI tmp4, rFlagsReg cr)
%{
predicate(((AryEqNode*)n)->encoding() == StrIntrinsicNode::LL);
match(Set result (AryEq ary1 ary2));
@@ -11107,7 +11198,7 @@
%}
instruct array_equalsC(rdi_RegP ary1, rsi_RegP ary2, rax_RegI result,
- regD tmp1, regD tmp2, rcx_RegI tmp3, rbx_RegI tmp4, rFlagsReg cr)
+ legVecS tmp1, legVecS tmp2, rcx_RegI tmp3, rbx_RegI tmp4, rFlagsReg cr)
%{
predicate(((AryEqNode*)n)->encoding() == StrIntrinsicNode::UU);
match(Set result (AryEq ary1 ary2));
@@ -11123,7 +11214,7 @@
%}
instruct has_negatives(rsi_RegP ary1, rcx_RegI len, rax_RegI result,
- regD tmp1, regD tmp2, rbx_RegI tmp3, rFlagsReg cr)
+ legVecS tmp1, legVecS tmp2, rbx_RegI tmp3, rFlagsReg cr)
%{
match(Set result (HasNegatives ary1 len));
effect(TEMP tmp1, TEMP tmp2, USE_KILL ary1, USE_KILL len, KILL tmp3, KILL cr);
@@ -11138,7 +11229,7 @@
%}
// fast char[] to byte[] compression
-instruct string_compress(rsi_RegP src, rdi_RegP dst, rdx_RegI len, regD tmp1, regD tmp2, regD tmp3, regD tmp4,
+instruct string_compress(rsi_RegP src, rdi_RegP dst, rdx_RegI len, legVecS tmp1, legVecS tmp2, legVecS tmp3, legVecS tmp4,
rcx_RegI tmp5, rax_RegI result, rFlagsReg cr) %{
match(Set result (StrCompressedCopy src (Binary dst len)));
effect(TEMP tmp1, TEMP tmp2, TEMP tmp3, TEMP tmp4, USE_KILL src, USE_KILL dst, USE_KILL len, KILL tmp5, KILL cr);
@@ -11154,7 +11245,7 @@
// fast byte[] to char[] inflation
instruct string_inflate(Universe dummy, rsi_RegP src, rdi_RegP dst, rdx_RegI len,
- regD tmp1, rcx_RegI tmp2, rFlagsReg cr) %{
+ legVecS tmp1, rcx_RegI tmp2, rFlagsReg cr) %{
match(Set dummy (StrInflatedCopy src (Binary dst len)));
effect(TEMP tmp1, TEMP tmp2, USE_KILL src, USE_KILL dst, USE_KILL len, KILL cr);
@@ -11168,7 +11259,7 @@
// encode char[] to byte[] in ISO_8859_1
instruct encode_iso_array(rsi_RegP src, rdi_RegP dst, rdx_RegI len,
- regD tmp1, regD tmp2, regD tmp3, regD tmp4,
+ legVecS tmp1, legVecS tmp2, legVecS tmp3, legVecS tmp4,
rcx_RegI tmp5, rax_RegI result, rFlagsReg cr) %{
match(Set result (EncodeISOArray src (Binary dst len)));
effect(TEMP tmp1, TEMP tmp2, TEMP tmp3, TEMP tmp4, USE_KILL src, USE_KILL dst, USE_KILL len, KILL tmp5, KILL cr);
--- a/src/hotspot/share/c1/c1_LIR.cpp Wed Sep 26 18:36:55 2018 +0100
+++ b/src/hotspot/share/c1/c1_LIR.cpp Thu Sep 27 10:49:10 2018 -0700
@@ -472,7 +472,6 @@
case lir_pop: // input always valid, result and info always invalid
case lir_return: // input always valid, result and info always invalid
case lir_leal: // input and result always valid, info always invalid
- case lir_neg: // input and result always valid, info always invalid
case lir_monaddr: // input and result always valid, info always invalid
case lir_null_check: // input and info always valid, result always invalid
case lir_move: // input and result always valid, may have info
@@ -580,6 +579,7 @@
case lir_rem:
case lir_sqrt:
case lir_abs:
+ case lir_neg:
case lir_logic_and:
case lir_logic_or:
case lir_logic_xor:
@@ -1662,7 +1662,6 @@
case lir_null_check: s = "null_check"; break;
case lir_return: s = "return"; break;
case lir_safepoint: s = "safepoint"; break;
- case lir_neg: s = "neg"; break;
case lir_leal: s = "leal"; break;
case lir_branch: s = "branch"; break;
case lir_cond_float_branch: s = "flt_cond_br"; break;
@@ -1690,6 +1689,7 @@
case lir_div_strictfp: s = "div_strictfp"; break;
case lir_rem: s = "rem"; break;
case lir_abs: s = "abs"; break;
+ case lir_neg: s = "neg"; break;
case lir_sqrt: s = "sqrt"; break;
case lir_logic_and: s = "logic_and"; break;
case lir_logic_or: s = "logic_or"; break;
--- a/src/hotspot/share/c1/c1_LIR.hpp Wed Sep 26 18:36:55 2018 +0100
+++ b/src/hotspot/share/c1/c1_LIR.hpp Thu Sep 27 10:49:10 2018 -0700
@@ -911,7 +911,6 @@
, lir_null_check
, lir_return
, lir_leal
- , lir_neg
, lir_branch
, lir_cond_float_branch
, lir_move
@@ -939,6 +938,7 @@
, lir_rem
, lir_sqrt
, lir_abs
+ , lir_neg
, lir_tan
, lir_log10
, lir_logic_and
@@ -2075,7 +2075,6 @@
void branch_destination(Label* lbl) { append(new LIR_OpLabel(lbl)); }
- void negate(LIR_Opr from, LIR_Opr to) { append(new LIR_Op1(lir_neg, from, to)); }
void leal(LIR_Opr from, LIR_Opr result_reg, LIR_PatchCode patch_code = lir_patch_none, CodeEmitInfo* info = NULL) { append(new LIR_Op1(lir_leal, from, result_reg, T_ILLEGAL, patch_code, info)); }
// result is a stack location for old backend and vreg for UseLinearScan
@@ -2159,6 +2158,7 @@
LIR_Opr t1, LIR_Opr t2, LIR_Opr result = LIR_OprFact::illegalOpr);
void abs (LIR_Opr from, LIR_Opr to, LIR_Opr tmp) { append(new LIR_Op2(lir_abs , from, tmp, to)); }
+ void negate(LIR_Opr from, LIR_Opr to, LIR_Opr tmp = LIR_OprFact::illegalOpr) { append(new LIR_Op2(lir_neg, 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)); }
--- a/src/hotspot/share/c1/c1_LIRAssembler.cpp Wed Sep 26 18:36:55 2018 +0100
+++ b/src/hotspot/share/c1/c1_LIRAssembler.cpp Thu Sep 27 10:49:10 2018 -0700
@@ -554,10 +554,6 @@
pop(op->in_opr());
break;
- case lir_neg:
- negate(op->in_opr(), op->result_opr());
- break;
-
case lir_leal:
leal(op->in_opr(), op->result_opr(), op->patch_code(), op->info());
break;
@@ -750,6 +746,10 @@
intrinsic_op(op->code(), op->in_opr1(), op->in_opr2(), op->result_opr(), op);
break;
+ case lir_neg:
+ negate(op->in_opr1(), op->result_opr(), op->in_opr2());
+ break;
+
case lir_logic_and:
case lir_logic_or:
case lir_logic_xor:
--- a/src/hotspot/share/c1/c1_LIRAssembler.hpp Wed Sep 26 18:36:55 2018 +0100
+++ b/src/hotspot/share/c1/c1_LIRAssembler.hpp Thu Sep 27 10:49:10 2018 -0700
@@ -239,7 +239,7 @@
void align_backward_branch_target();
void align_call(LIR_Code code);
- void negate(LIR_Opr left, LIR_Opr dest);
+ void negate(LIR_Opr left, LIR_Opr dest, LIR_Opr tmp = LIR_OprFact::illegalOpr);
void leal(LIR_Opr src, LIR_Opr dest, LIR_PatchCode patch_code, CodeEmitInfo* info);
void rt_call(LIR_Opr result, address dest, const LIR_OprList* args, LIR_Opr tmp, CodeEmitInfo* info);
--- a/src/hotspot/share/classfile/classLoaderData.cpp Wed Sep 26 18:36:55 2018 +0100
+++ b/src/hotspot/share/classfile/classLoaderData.cpp Thu Sep 27 10:49:10 2018 -0700
@@ -605,9 +605,10 @@
// if they are not already on the _klasses list.
free_deallocate_list_C_heap_structures();
- // Tell serviceability tools these classes are unloading
+ // Clean up class dependencies and tell serviceability tools
+ // these classes are unloading. Must be called
// after erroneous classes are released.
- classes_do(InstanceKlass::notify_unload_class);
+ classes_do(InstanceKlass::unload_class);
// Clean up global class iterator for compiler
static_klass_iterator.adjust_saved_class(this);
--- a/src/hotspot/share/code/dependencyContext.cpp Wed Sep 26 18:36:55 2018 +0100
+++ b/src/hotspot/share/code/dependencyContext.cpp Thu Sep 27 10:49:10 2018 -0700
@@ -218,18 +218,6 @@
return marked;
}
-void DependencyContext::wipe() {
- assert_locked_or_safepoint(CodeCache_lock);
- nmethodBucket* b = dependencies();
- set_dependencies(NULL);
- set_has_stale_entries(false);
- while (b != NULL) {
- nmethodBucket* next = b->next();
- delete b;
- b = next;
- }
-}
-
#ifndef PRODUCT
void DependencyContext::print_dependent_nmethods(bool verbose) {
int idx = 0;
--- a/src/hotspot/share/code/dependencyContext.hpp Wed Sep 26 18:36:55 2018 +0100
+++ b/src/hotspot/share/code/dependencyContext.hpp Thu Sep 27 10:49:10 2018 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -141,10 +141,6 @@
void expunge_stale_entries();
- // Unsafe deallocation of nmethodBuckets. Used in IK::release_C_heap_structures
- // to clean up the context possibly containing live entries pointing to unloaded nmethods.
- void wipe();
-
#ifndef PRODUCT
void print_dependent_nmethods(bool verbose);
bool is_dependent_nmethod(nmethod* nm);
--- a/src/hotspot/share/gc/g1/g1CollectedHeap.cpp Wed Sep 26 18:36:55 2018 +0100
+++ b/src/hotspot/share/gc/g1/g1CollectedHeap.cpp Thu Sep 27 10:49:10 2018 -0700
@@ -3169,18 +3169,24 @@
}
bool G1ParEvacuateFollowersClosure::offer_termination() {
+ EventGCPhaseParallel event;
G1ParScanThreadState* const pss = par_scan_state();
start_term_time();
const bool res = terminator()->offer_termination();
end_term_time();
+ event.commit(GCId::current(), pss->worker_id(), G1GCPhaseTimes::phase_name(G1GCPhaseTimes::Termination));
return res;
}
void G1ParEvacuateFollowersClosure::do_void() {
+ EventGCPhaseParallel event;
G1ParScanThreadState* const pss = par_scan_state();
pss->trim_queue();
+ event.commit(GCId::current(), pss->worker_id(), G1GCPhaseTimes::phase_name(G1GCPhaseTimes::ObjCopy));
do {
+ EventGCPhaseParallel event;
pss->steal_and_trim_queue(queues());
+ event.commit(GCId::current(), pss->worker_id(), G1GCPhaseTimes::phase_name(G1GCPhaseTimes::ObjCopy));
} while (!offer_termination());
}
@@ -4050,6 +4056,7 @@
break;
}
+ EventGCPhaseParallel event;
double start_time = os::elapsedTime();
end = MIN2(end, _num_work_items);
@@ -4064,9 +4071,11 @@
if (is_young) {
young_time += time_taken;
has_young_time = true;
+ event.commit(GCId::current(), worker_id, G1GCPhaseTimes::phase_name(G1GCPhaseTimes::YoungFreeCSet));
} else {
non_young_time += time_taken;
has_non_young_time = true;
+ event.commit(GCId::current(), worker_id, G1GCPhaseTimes::phase_name(G1GCPhaseTimes::NonYoungFreeCSet));
}
start_time = end_time;
}
--- a/src/hotspot/share/gc/g1/g1GCPhaseTimes.cpp Wed Sep 26 18:36:55 2018 +0100
+++ b/src/hotspot/share/gc/g1/g1GCPhaseTimes.cpp Thu Sep 27 10:49:10 2018 -0700
@@ -465,6 +465,48 @@
}
}
+const char* G1GCPhaseTimes::phase_name(GCParPhases phase) {
+ static const char* names[] = {
+ "GCWorkerStart",
+ "ExtRootScan",
+ "ThreadRoots",
+ "StringTableRoots",
+ "UniverseRoots",
+ "JNIRoots",
+ "ObjectSynchronizerRoots",
+ "ManagementRoots",
+ "SystemDictionaryRoots",
+ "CLDGRoots",
+ "JVMTIRoots",
+ "CMRefRoots",
+ "WaitForStrongCLD",
+ "WeakCLDRoots",
+ "SATBFiltering",
+ "UpdateRS",
+ "ScanHCC",
+ "ScanRS",
+ "CodeRoots",
+#if INCLUDE_AOT
+ "AOTCodeRoots",
+#endif
+ "ObjCopy",
+ "Termination",
+ "Other",
+ "GCWorkerTotal",
+ "GCWorkerEnd",
+ "StringDedupQueueFixup",
+ "StringDedupTableFixup",
+ "RedirtyCards",
+ "YoungFreeCSet",
+ "NonYoungFreeCSet"
+ //GCParPhasesSentinel only used to tell end of enum
+ };
+
+ STATIC_ASSERT(ARRAY_SIZE(names) == G1GCPhaseTimes::GCParPhasesSentinel); // GCParPhases enum and corresponding string array should have the same "length", this tries to assert it
+
+ return names[phase];
+}
+
G1EvacPhaseWithTrimTimeTracker::G1EvacPhaseWithTrimTimeTracker(G1ParScanThreadState* pss, Tickspan& total_time, Tickspan& trim_time) :
_pss(pss),
_start(Ticks::now()),
@@ -490,7 +532,7 @@
}
G1GCParPhaseTimesTracker::G1GCParPhaseTimesTracker(G1GCPhaseTimes* phase_times, G1GCPhaseTimes::GCParPhases phase, uint worker_id) :
- _start_time(), _phase(phase), _phase_times(phase_times), _worker_id(worker_id) {
+ _start_time(), _phase(phase), _phase_times(phase_times), _worker_id(worker_id), _event() {
if (_phase_times != NULL) {
_start_time = Ticks::now();
}
@@ -499,6 +541,7 @@
G1GCParPhaseTimesTracker::~G1GCParPhaseTimesTracker() {
if (_phase_times != NULL) {
_phase_times->record_time_secs(_phase, _worker_id, (Ticks::now() - _start_time).seconds());
+ _event.commit(GCId::current(), _worker_id, G1GCPhaseTimes::phase_name(_phase));
}
}
--- a/src/hotspot/share/gc/g1/g1GCPhaseTimes.hpp Wed Sep 26 18:36:55 2018 +0100
+++ b/src/hotspot/share/gc/g1/g1GCPhaseTimes.hpp Thu Sep 27 10:49:10 2018 -0700
@@ -27,6 +27,7 @@
#include "gc/shared/referenceProcessorPhaseTimes.hpp"
#include "gc/shared/weakProcessorPhaseTimes.hpp"
+#include "jfr/jfrEvents.hpp"
#include "logging/logLevel.hpp"
#include "memory/allocation.hpp"
#include "utilities/macros.hpp"
@@ -190,6 +191,7 @@
G1GCPhaseTimes(STWGCTimer* gc_timer, uint max_gc_threads);
void note_gc_start();
void print();
+ static const char* phase_name(GCParPhases phase);
// record the time a phase took in seconds
void record_time_secs(GCParPhases phase, uint worker_i, double secs);
@@ -385,6 +387,7 @@
G1GCPhaseTimes::GCParPhases _phase;
G1GCPhaseTimes* _phase_times;
uint _worker_id;
+ EventGCPhaseParallel _event;
public:
G1GCParPhaseTimesTracker(G1GCPhaseTimes* phase_times, G1GCPhaseTimes::GCParPhases phase, uint worker_id);
virtual ~G1GCParPhaseTimesTracker();
--- a/src/hotspot/share/gc/g1/g1RemSet.cpp Wed Sep 26 18:36:55 2018 +0100
+++ b/src/hotspot/share/gc/g1/g1RemSet.cpp Thu Sep 27 10:49:10 2018 -0700
@@ -40,6 +40,7 @@
#include "gc/g1/heapRegionRemSet.hpp"
#include "gc/shared/gcTraceTime.inline.hpp"
#include "gc/shared/suspendibleThreadSet.hpp"
+#include "jfr/jfrEvents.hpp"
#include "memory/iterator.hpp"
#include "memory/resourceArea.hpp"
#include "oops/access.inline.hpp"
@@ -339,6 +340,7 @@
}
void G1ScanRSForRegionClosure::scan_rem_set_roots(HeapRegion* r) {
+ EventGCPhaseParallel event;
uint const region_idx = r->hrm_index();
if (_scan_state->claim_iter(region_idx)) {
@@ -392,10 +394,13 @@
scan_card(mr, region_idx_for_card);
}
+ event.commit(GCId::current(), _worker_i, G1GCPhaseTimes::phase_name(G1GCPhaseTimes::ScanRS));
}
void G1ScanRSForRegionClosure::scan_strong_code_roots(HeapRegion* r) {
+ EventGCPhaseParallel event;
r->strong_code_roots_do(_pss->closures()->weak_codeblobs());
+ event.commit(GCId::current(), _worker_i, G1GCPhaseTimes::phase_name(G1GCPhaseTimes::CodeRoots));
}
bool G1ScanRSForRegionClosure::do_heap_region(HeapRegion* r) {
--- a/src/hotspot/share/gc/shared/c2/barrierSetC2.cpp Wed Sep 26 18:36:55 2018 +0100
+++ b/src/hotspot/share/gc/shared/c2/barrierSetC2.cpp Thu Sep 27 10:49:10 2018 -0700
@@ -310,7 +310,7 @@
//--------------------------- atomic operations---------------------------------
-static void pin_atomic_op(C2AtomicAccess& access) {
+void BarrierSetC2::pin_atomic_op(C2AtomicAccess& access) const {
if (!access.needs_pinning()) {
return;
}
--- a/src/hotspot/share/gc/shared/c2/barrierSetC2.hpp Wed Sep 26 18:36:55 2018 +0100
+++ b/src/hotspot/share/gc/shared/c2/barrierSetC2.hpp Thu Sep 27 10:49:10 2018 -0700
@@ -76,14 +76,12 @@
// This class wraps a node and a pointer type.
class C2AccessValuePtr: public C2AccessValue {
- int _alias_idx;
public:
C2AccessValuePtr(Node* node, const TypePtr* type) :
C2AccessValue(node, reinterpret_cast<const Type*>(type)) {}
const TypePtr* type() const { return reinterpret_cast<const TypePtr*>(_type); }
- int alias_idx() const { return _alias_idx; }
};
// This class wraps a bunch of context parameters thare are passed around in the
@@ -175,6 +173,7 @@
Node* new_val, const Type* value_type) const;
virtual Node* atomic_xchg_at_resolved(C2AtomicAccess& access, Node* new_val, const Type* val_type) const;
virtual Node* atomic_add_at_resolved(C2AtomicAccess& access, Node* new_val, const Type* val_type) const;
+ void pin_atomic_op(C2AtomicAccess& access) const;
public:
// This is the entry-point for the backend to perform accesses through the Access API.
--- a/src/hotspot/share/jfr/metadata/metadata.xml Wed Sep 26 18:36:55 2018 +0100
+++ b/src/hotspot/share/jfr/metadata/metadata.xml Thu Sep 27 10:49:10 2018 -0700
@@ -435,6 +435,13 @@
<Field type="string" name="name" label="Name" />
</Event>
+ <Event name="GCPhaseParallel" category="Java Virtual Machine, GC, Phases" label="GC Phase Parallel"
+ startTime="true" thread="true" description="GC phases for parallel workers">
+ <Field type="uint" name="gcId" label="GC Identifier" relation="GcId"/>
+ <Field type="uint" name="gcWorkerId" label="GC Worker Identifier" />
+ <Field type="string" name="name" label="Name" />
+ </Event>
+
<Event name="AllocationRequiringGC" category="Java Virtual Machine, GC, Detailed" label="Allocation Requiring GC" thread="true" stackTrace="true"
startTime="false">
<Field type="uint" name="gcId" label="Pending GC Identifier" relation="GcId" />
--- a/src/hotspot/share/oops/instanceKlass.cpp Wed Sep 26 18:36:55 2018 +0100
+++ b/src/hotspot/share/oops/instanceKlass.cpp Thu Sep 27 10:49:10 2018 -0700
@@ -2417,7 +2417,10 @@
}
#endif
-void InstanceKlass::notify_unload_class(InstanceKlass* ik) {
+void InstanceKlass::unload_class(InstanceKlass* ik) {
+ // Release dependencies.
+ ik->dependencies().remove_all_dependents();
+
// notify the debugger
if (JvmtiExport::should_post_class_unload()) {
JvmtiExport::post_class_unload(ik);
@@ -2462,16 +2465,8 @@
FreeHeap(jmeths);
}
- // Release dependencies.
- // It is desirable to use DC::remove_all_dependents() here, but, unfortunately,
- // it is not safe (see JDK-8143408). The problem is that the klass dependency
- // context can contain live dependencies, since there's a race between nmethod &
- // klass unloading. If the klass is dead when nmethod unloading happens, relevant
- // dependencies aren't removed from the context associated with the class (see
- // nmethod::flush_dependencies). It ends up during klass unloading as seemingly
- // live dependencies pointing to unloaded nmethods and causes a crash in
- // DC::remove_all_dependents() when it touches unloaded nmethod.
- dependencies().wipe();
+ assert(_dep_context == DependencyContext::EMPTY,
+ "dependencies should already be cleaned");
#if INCLUDE_JVMTI
// Deallocate breakpoint records
--- a/src/hotspot/share/oops/instanceKlass.hpp Wed Sep 26 18:36:55 2018 +0100
+++ b/src/hotspot/share/oops/instanceKlass.hpp Thu Sep 27 10:49:10 2018 -0700
@@ -1180,7 +1180,7 @@
bool on_stack() const { return _constants->on_stack(); }
// callbacks for actions during class unloading
- static void notify_unload_class(InstanceKlass* ik);
+ static void unload_class(InstanceKlass* ik);
static void release_C_heap_structures(InstanceKlass* ik);
// Naming
--- a/src/hotspot/share/opto/graphKit.cpp Wed Sep 26 18:36:55 2018 +0100
+++ b/src/hotspot/share/opto/graphKit.cpp Thu Sep 27 10:49:10 2018 -0700
@@ -605,7 +605,7 @@
Node *adr = basic_plus_adr(ex_node, ex_node, offset);
const TypeOopPtr* val_type = TypeOopPtr::make_from_klass(env()->String_klass());
- Node *store = access_store_at(control(), ex_node, adr, adr_typ, null(), val_type, T_OBJECT, IN_HEAP);
+ Node *store = access_store_at(ex_node, adr, adr_typ, null(), val_type, T_OBJECT, IN_HEAP);
add_exception_state(make_exception_state(ex_node));
return;
@@ -1544,8 +1544,7 @@
return st;
}
-Node* GraphKit::access_store_at(Node* ctl,
- Node* obj,
+Node* GraphKit::access_store_at(Node* obj,
Node* adr,
const TypePtr* adr_type,
Node* val,
@@ -1559,7 +1558,6 @@
val = _gvn.makecon(TypePtr::NULL_PTR);
}
- set_control(ctl);
if (stopped()) {
return top(); // Dead path ?
}
@@ -1612,8 +1610,7 @@
}
}
-Node* GraphKit::access_atomic_cmpxchg_val_at(Node* ctl,
- Node* obj,
+Node* GraphKit::access_atomic_cmpxchg_val_at(Node* obj,
Node* adr,
const TypePtr* adr_type,
int alias_idx,
@@ -1622,7 +1619,6 @@
const Type* value_type,
BasicType bt,
DecoratorSet decorators) {
- set_control(ctl);
C2AccessValuePtr addr(adr, adr_type);
C2AtomicAccess access(this, decorators | C2_READ_ACCESS | C2_WRITE_ACCESS,
bt, obj, addr, alias_idx);
@@ -1633,8 +1629,7 @@
}
}
-Node* GraphKit::access_atomic_cmpxchg_bool_at(Node* ctl,
- Node* obj,
+Node* GraphKit::access_atomic_cmpxchg_bool_at(Node* obj,
Node* adr,
const TypePtr* adr_type,
int alias_idx,
@@ -1643,7 +1638,6 @@
const Type* value_type,
BasicType bt,
DecoratorSet decorators) {
- set_control(ctl);
C2AccessValuePtr addr(adr, adr_type);
C2AtomicAccess access(this, decorators | C2_READ_ACCESS | C2_WRITE_ACCESS,
bt, obj, addr, alias_idx);
@@ -1654,8 +1648,7 @@
}
}
-Node* GraphKit::access_atomic_xchg_at(Node* ctl,
- Node* obj,
+Node* GraphKit::access_atomic_xchg_at(Node* obj,
Node* adr,
const TypePtr* adr_type,
int alias_idx,
@@ -1663,7 +1656,6 @@
const Type* value_type,
BasicType bt,
DecoratorSet decorators) {
- set_control(ctl);
C2AccessValuePtr addr(adr, adr_type);
C2AtomicAccess access(this, decorators | C2_READ_ACCESS | C2_WRITE_ACCESS,
bt, obj, addr, alias_idx);
@@ -1674,8 +1666,7 @@
}
}
-Node* GraphKit::access_atomic_add_at(Node* ctl,
- Node* obj,
+Node* GraphKit::access_atomic_add_at(Node* obj,
Node* adr,
const TypePtr* adr_type,
int alias_idx,
@@ -1683,7 +1674,6 @@
const Type* value_type,
BasicType bt,
DecoratorSet decorators) {
- set_control(ctl);
C2AccessValuePtr addr(adr, adr_type);
C2AtomicAccess access(this, decorators | C2_READ_ACCESS | C2_WRITE_ACCESS, bt, obj, addr, alias_idx);
if (access.is_raw()) {
@@ -1693,8 +1683,7 @@
}
}
-void GraphKit::access_clone(Node* ctl, Node* src, Node* dst, Node* size, bool is_array) {
- set_control(ctl);
+void GraphKit::access_clone(Node* src, Node* dst, Node* size, bool is_array) {
return _barrier_set->clone(this, src, dst, size, is_array);
}
@@ -3849,14 +3838,14 @@
sync_kit(ideal);
}
-Node* GraphKit::load_String_length(Node* ctrl, Node* str) {
- Node* len = load_array_length(load_String_value(ctrl, str));
- Node* coder = load_String_coder(ctrl, str);
+Node* GraphKit::load_String_length(Node* str, bool set_ctrl) {
+ Node* len = load_array_length(load_String_value(str, set_ctrl));
+ Node* coder = load_String_coder(str, set_ctrl);
// Divide length by 2 if coder is UTF16
return _gvn.transform(new RShiftINode(len, coder));
}
-Node* GraphKit::load_String_value(Node* ctrl, Node* str) {
+Node* GraphKit::load_String_value(Node* str, bool set_ctrl) {
int value_offset = java_lang_String::value_offset_in_bytes();
const TypeInstPtr* string_type = TypeInstPtr::make(TypePtr::NotNull, C->env()->String_klass(),
false, NULL, 0);
@@ -3866,7 +3855,7 @@
ciTypeArrayKlass::make(T_BYTE), true, 0);
Node* p = basic_plus_adr(str, str, value_offset);
Node* load = access_load_at(str, p, value_field_type, value_type, T_OBJECT,
- IN_HEAP | C2_CONTROL_DEPENDENT_LOAD);
+ IN_HEAP | (set_ctrl ? C2_CONTROL_DEPENDENT_LOAD : 0) | MO_UNORDERED);
// String.value field is known to be @Stable.
if (UseImplicitStableValues) {
load = cast_array_to_stable(load, value_type);
@@ -3874,7 +3863,7 @@
return load;
}
-Node* GraphKit::load_String_coder(Node* ctrl, Node* str) {
+Node* GraphKit::load_String_coder(Node* str, bool set_ctrl) {
if (!CompactStrings) {
return intcon(java_lang_String::CODER_UTF16);
}
@@ -3883,27 +3872,31 @@
false, NULL, 0);
const TypePtr* coder_field_type = string_type->add_offset(coder_offset);
int coder_field_idx = C->get_alias_index(coder_field_type);
- return make_load(ctrl, basic_plus_adr(str, str, coder_offset),
- TypeInt::BYTE, T_BYTE, coder_field_idx, MemNode::unordered);
+
+ Node* p = basic_plus_adr(str, str, coder_offset);
+ Node* load = access_load_at(str, p, coder_field_type, TypeInt::BYTE, T_BYTE,
+ IN_HEAP | (set_ctrl ? C2_CONTROL_DEPENDENT_LOAD : 0) | MO_UNORDERED);
+ return load;
}
-void GraphKit::store_String_value(Node* ctrl, Node* str, Node* value) {
+void GraphKit::store_String_value(Node* str, Node* value) {
int value_offset = java_lang_String::value_offset_in_bytes();
const TypeInstPtr* string_type = TypeInstPtr::make(TypePtr::NotNull, C->env()->String_klass(),
false, NULL, 0);
const TypePtr* value_field_type = string_type->add_offset(value_offset);
- access_store_at(ctrl, str, basic_plus_adr(str, value_offset), value_field_type,
- value, TypeAryPtr::BYTES, T_OBJECT, IN_HEAP);
+
+ access_store_at(str, basic_plus_adr(str, value_offset), value_field_type,
+ value, TypeAryPtr::BYTES, T_OBJECT, IN_HEAP | MO_UNORDERED);
}
-void GraphKit::store_String_coder(Node* ctrl, Node* str, Node* value) {
+void GraphKit::store_String_coder(Node* str, Node* value) {
int coder_offset = java_lang_String::coder_offset_in_bytes();
const TypeInstPtr* string_type = TypeInstPtr::make(TypePtr::NotNull, C->env()->String_klass(),
false, NULL, 0);
const TypePtr* coder_field_type = string_type->add_offset(coder_offset);
- int coder_field_idx = C->get_alias_index(coder_field_type);
- store_to_memory(ctrl, basic_plus_adr(str, coder_offset),
- value, T_BYTE, coder_field_idx, MemNode::unordered);
+
+ access_store_at(str, basic_plus_adr(str, coder_offset), coder_field_type,
+ value, TypeInt::BYTE, T_BYTE, IN_HEAP | MO_UNORDERED);
}
// Capture src and dst memory state with a MergeMemNode
--- a/src/hotspot/share/opto/graphKit.hpp Wed Sep 26 18:36:55 2018 +0100
+++ b/src/hotspot/share/opto/graphKit.hpp Thu Sep 27 10:49:10 2018 -0700
@@ -572,8 +572,7 @@
// Perform decorated accesses
- Node* access_store_at(Node* ctl,
- Node* obj, // containing obj
+ Node* access_store_at(Node* obj, // containing obj
Node* adr, // actual adress to store val at
const TypePtr* adr_type,
Node* val,
@@ -593,8 +592,7 @@
BasicType bt,
DecoratorSet decorators);
- Node* access_atomic_cmpxchg_val_at(Node* ctl,
- Node* obj,
+ Node* access_atomic_cmpxchg_val_at(Node* obj,
Node* adr,
const TypePtr* adr_type,
int alias_idx,
@@ -604,8 +602,7 @@
BasicType bt,
DecoratorSet decorators);
- Node* access_atomic_cmpxchg_bool_at(Node* ctl,
- Node* obj,
+ Node* access_atomic_cmpxchg_bool_at(Node* obj,
Node* adr,
const TypePtr* adr_type,
int alias_idx,
@@ -615,8 +612,7 @@
BasicType bt,
DecoratorSet decorators);
- Node* access_atomic_xchg_at(Node* ctl,
- Node* obj,
+ Node* access_atomic_xchg_at(Node* obj,
Node* adr,
const TypePtr* adr_type,
int alias_idx,
@@ -625,8 +621,7 @@
BasicType bt,
DecoratorSet decorators);
- Node* access_atomic_add_at(Node* ctl,
- Node* obj,
+ Node* access_atomic_add_at(Node* obj,
Node* adr,
const TypePtr* adr_type,
int alias_idx,
@@ -635,7 +630,7 @@
BasicType bt,
DecoratorSet decorators);
- void access_clone(Node* ctl, Node* src, Node* dst, Node* size, bool is_array);
+ void access_clone(Node* src, Node* dst, Node* size, bool is_array);
Node* access_resolve(Node* n, DecoratorSet decorators);
@@ -849,11 +844,11 @@
bool deoptimize_on_exception = false);
// java.lang.String helpers
- Node* load_String_length(Node* ctrl, Node* str);
- Node* load_String_value(Node* ctrl, Node* str);
- Node* load_String_coder(Node* ctrl, Node* str);
- void store_String_value(Node* ctrl, Node* str, Node* value);
- void store_String_coder(Node* ctrl, Node* str, Node* value);
+ Node* load_String_length(Node* str, bool set_ctrl);
+ Node* load_String_value(Node* str, bool set_ctrl);
+ Node* load_String_coder(Node* str, bool set_ctrl);
+ void store_String_value(Node* str, Node* value);
+ void store_String_coder(Node* str, Node* value);
Node* capture_memory(const TypePtr* src_type, const TypePtr* dst_type);
Node* compress_string(Node* src, const TypeAryPtr* src_type, Node* dst, Node* count);
void inflate_string(Node* src, Node* dst, const TypeAryPtr* dst_type, Node* count);
--- a/src/hotspot/share/opto/library_call.cpp Wed Sep 26 18:36:55 2018 +0100
+++ b/src/hotspot/share/opto/library_call.cpp Thu Sep 27 10:49:10 2018 -0700
@@ -543,10 +543,7 @@
case vmIntrinsics::_notify:
case vmIntrinsics::_notifyAll:
- if (ObjectMonitor::Knob_InlineNotify) {
- return inline_notify(intrinsic_id());
- }
- return false;
+ return inline_notify(intrinsic_id());
case vmIntrinsics::_addExactI: return inline_math_addExactI(false /* add */);
case vmIntrinsics::_addExactL: return inline_math_addExactL(false /* add */);
@@ -1761,11 +1758,9 @@
return false;
}
if (is_store) {
- (void) store_to_memory(control(), adr, ch, T_CHAR, TypeAryPtr::BYTES, MemNode::unordered,
- false, false, true /* mismatched */);
+ access_store_at(value, adr, TypeAryPtr::BYTES, ch, TypeInt::CHAR, T_CHAR, IN_HEAP | MO_UNORDERED | C2_MISMATCHED);
} else {
- ch = make_load(control(), adr, TypeInt::CHAR, T_CHAR, TypeAryPtr::BYTES, MemNode::unordered,
- LoadNode::DependsOnlyOnTest, false, false, true /* mismatched */);
+ ch = access_load_at(value, adr, TypeAryPtr::BYTES, TypeInt::CHAR, T_CHAR, IN_HEAP | MO_UNORDERED | C2_MISMATCHED | C2_CONTROL_DEPENDENT_LOAD);
set_result(ch);
}
return true;
@@ -2515,7 +2510,7 @@
val = ConvL2X(val);
val = gvn().transform(new CastX2PNode(val));
}
- access_store_at(control(), heap_base_oop, adr, adr_type, val, value_type, type, decorators);
+ access_store_at(heap_base_oop, adr, adr_type, val, value_type, type, decorators);
}
return true;
@@ -2734,24 +2729,24 @@
Node* result = NULL;
switch (kind) {
case LS_cmp_exchange: {
- result = access_atomic_cmpxchg_val_at(control(), base, adr, adr_type, alias_idx,
+ result = access_atomic_cmpxchg_val_at(base, adr, adr_type, alias_idx,
oldval, newval, value_type, type, decorators);
break;
}
case LS_cmp_swap_weak:
decorators |= C2_WEAK_CMPXCHG;
case LS_cmp_swap: {
- result = access_atomic_cmpxchg_bool_at(control(), base, adr, adr_type, alias_idx,
+ result = access_atomic_cmpxchg_bool_at(base, adr, adr_type, alias_idx,
oldval, newval, value_type, type, decorators);
break;
}
case LS_get_set: {
- result = access_atomic_xchg_at(control(), base, adr, adr_type, alias_idx,
+ result = access_atomic_xchg_at(base, adr, adr_type, alias_idx,
newval, value_type, type, decorators);
break;
}
case LS_get_add: {
- result = access_atomic_add_at(control(), base, adr, adr_type, alias_idx,
+ result = access_atomic_add_at(base, adr, adr_type, alias_idx,
newval, value_type, type, decorators);
break;
}
@@ -4235,7 +4230,7 @@
// TODO: generate fields copies for small objects instead.
Node* size = _gvn.transform(obj_size);
- access_clone(control(), obj, alloc_obj, size, is_array);
+ access_clone(obj, alloc_obj, size, is_array);
// Do not let reads from the cloned object float above the arraycopy.
if (alloc != NULL) {
--- a/src/hotspot/share/opto/parse2.cpp Wed Sep 26 18:36:55 2018 +0100
+++ b/src/hotspot/share/opto/parse2.cpp Thu Sep 27 10:49:10 2018 -0700
@@ -104,7 +104,7 @@
const TypeAryPtr* adr_type = TypeAryPtr::get_array_body_type(bt);
- access_store_at(control(), array, adr, adr_type, val, elemtype, bt, MO_UNORDERED | IN_HEAP | IS_ARRAY);
+ access_store_at(array, adr, adr_type, val, elemtype, bt, MO_UNORDERED | IN_HEAP | IS_ARRAY);
}
--- a/src/hotspot/share/opto/parse3.cpp Wed Sep 26 18:36:55 2018 +0100
+++ b/src/hotspot/share/opto/parse3.cpp Thu Sep 27 10:49:10 2018 -0700
@@ -264,7 +264,7 @@
field_type = Type::BOTTOM;
}
}
- access_store_at(control(), obj, adr, adr_type, val, field_type, bt, decorators);
+ access_store_at(obj, adr, adr_type, val, field_type, bt, decorators);
if (is_field) {
// Remember we wrote a volatile field.
@@ -351,7 +351,7 @@
Node* elem = expand_multianewarray(array_klass_1, &lengths[1], ndimensions-1, nargs);
intptr_t offset = header + ((intptr_t)i << LogBytesPerHeapOop);
Node* eaddr = basic_plus_adr(array, offset);
- access_store_at(control(), array, eaddr, adr_type, elem, elemtype, T_OBJECT, IN_HEAP | IS_ARRAY);
+ access_store_at(array, eaddr, adr_type, elem, elemtype, T_OBJECT, IN_HEAP | IS_ARRAY);
}
}
return array;
--- a/src/hotspot/share/opto/parseHelper.cpp Wed Sep 26 18:36:55 2018 +0100
+++ b/src/hotspot/share/opto/parseHelper.cpp Thu Sep 27 10:49:10 2018 -0700
@@ -437,9 +437,9 @@
Node* adr_node = method_data_addressing(md, data, DataLayout::flags_offset());
const TypePtr* adr_type = _gvn.type(adr_node)->is_ptr();
- Node* flags = make_load(NULL, adr_node, TypeInt::BYTE, T_BYTE, adr_type, MemNode::unordered);
+ Node* flags = make_load(NULL, adr_node, TypeInt::INT, T_INT, adr_type, MemNode::unordered);
Node* incr = _gvn.transform(new OrINode(flags, _gvn.intcon(flag_constant)));
- store_to_memory(NULL, adr_node, incr, T_BYTE, adr_type, MemNode::unordered);
+ store_to_memory(NULL, adr_node, incr, T_INT, adr_type, MemNode::unordered);
}
//----------------------------profile_taken_branch-----------------------------
--- a/src/hotspot/share/opto/stringopts.cpp Wed Sep 26 18:36:55 2018 +0100
+++ b/src/hotspot/share/opto/stringopts.cpp Thu Sep 27 10:49:10 2018 -0700
@@ -1547,7 +1547,7 @@
// Compress copy contents of the byte/char String str into dst_array starting at index start.
Node* PhaseStringOpts::copy_string(GraphKit& kit, Node* str, Node* dst_array, Node* dst_coder, Node* start) {
- Node* src_array = kit.load_String_value(kit.control(), str);
+ Node* src_array = kit.load_String_value(str, true);
src_array = kit.access_resolve(src_array, ACCESS_READ);
IdealKit ideal(&kit, true, true);
@@ -1580,7 +1580,7 @@
// Non-constant source string
if (CompactStrings) {
// Emit runtime check for coder
- Node* coder = kit.load_String_coder(__ ctrl(), str);
+ Node* coder = kit.load_String_coder(str, true);
__ if_then(coder, BoolTest::eq, __ ConI(java_lang_String::CODER_LATIN1)); {
// Source is Latin1
copy_latin1_string(kit, ideal, src_array, count, dst_array, dst_coder, start);
@@ -1796,8 +1796,8 @@
// replace the argument with the null checked version
arg = null_string;
sc->set_argument(argi, arg);
- count = kit.load_String_length(kit.control(), arg);
- arg_coder = kit.load_String_coder(kit.control(), arg);
+ count = kit.load_String_length(arg, true);
+ arg_coder = kit.load_String_coder(arg, true);
} else if (!type->higher_equal(TypeInstPtr::NOTNULL)) {
// s = s != null ? s : "null";
// length = length + (s.count - s.offset);
@@ -1820,14 +1820,14 @@
// replace the argument with the null checked version
arg = phi;
sc->set_argument(argi, arg);
- count = kit.load_String_length(kit.control(), arg);
- arg_coder = kit.load_String_coder(kit.control(), arg);
+ count = kit.load_String_length(arg, true);
+ arg_coder = kit.load_String_coder(arg, true);
} else {
// A corresponding nullcheck will be connected during IGVN MemNode::Ideal_common_DU_postCCP
// kit.control might be a different test, that can be hoisted above the actual nullcheck
// in case, that the control input is not null, Ideal_common_DU_postCCP will not look for a nullcheck.
- count = kit.load_String_length(NULL, arg);
- arg_coder = kit.load_String_coder(NULL, arg);
+ count = kit.load_String_length(arg, false);
+ arg_coder = kit.load_String_coder(arg, false);
}
if (arg->is_Con()) {
// Constant string. Get constant coder and length.
@@ -1918,7 +1918,7 @@
sc->mode(0) == StringConcat::StringNullCheckMode)) {
// Handle the case when there is only a single String argument.
// In this case, we can just pull the value from the String itself.
- dst_array = kit.load_String_value(kit.control(), sc->argument(0));
+ dst_array = kit.load_String_value(sc->argument(0), true);
} else {
// Allocate destination byte array according to coder
dst_array = allocate_byte_array(kit, NULL, __ LShiftI(length, coder));
@@ -1959,8 +1959,8 @@
}
// Initialize the string
- kit.store_String_value(kit.control(), result, dst_array);
- kit.store_String_coder(kit.control(), result, coder);
+ kit.store_String_value(result, dst_array);
+ kit.store_String_coder(result, coder);
// The value field is final. Emit a barrier here to ensure that the effect
// of the initialization is committed to memory before any code publishes
--- a/src/hotspot/share/opto/subnode.cpp Wed Sep 26 18:36:55 2018 +0100
+++ b/src/hotspot/share/opto/subnode.cpp Thu Sep 27 10:49:10 2018 -0700
@@ -1522,6 +1522,37 @@
return new BoolNode( ncmp, _test._test );
}
+ // Change "bool eq/ne (cmp (phi (X -X) 0))" into "bool eq/ne (cmp X 0)"
+ // since zero check of conditional negation of an integer is equal to
+ // zero check of the integer directly.
+ if ((_test._test == BoolTest::eq || _test._test == BoolTest::ne) &&
+ (cop == Op_CmpI) &&
+ (cmp2_type == TypeInt::ZERO) &&
+ (cmp1_op == Op_Phi)) {
+ // There should be a diamond phi with true path at index 1 or 2
+ PhiNode *phi = cmp1->as_Phi();
+ int idx_true = phi->is_diamond_phi();
+ if (idx_true != 0) {
+ // True input is in(idx_true) while false input is in(3 - idx_true)
+ Node *tin = phi->in(idx_true);
+ Node *fin = phi->in(3 - idx_true);
+ if ((tin->Opcode() == Op_SubI) &&
+ (phase->type(tin->in(1)) == TypeInt::ZERO) &&
+ (tin->in(2) == fin)) {
+ // Found conditional negation at true path, create a new CmpINode without that
+ Node *ncmp = phase->transform(new CmpINode(fin, cmp2));
+ return new BoolNode(ncmp, _test._test);
+ }
+ if ((fin->Opcode() == Op_SubI) &&
+ (phase->type(fin->in(1)) == TypeInt::ZERO) &&
+ (fin->in(2) == tin)) {
+ // Found conditional negation at false path, create a new CmpINode without that
+ Node *ncmp = phase->transform(new CmpINode(tin, cmp2));
+ return new BoolNode(ncmp, _test._test);
+ }
+ }
+ }
+
// Change (-A vs 0) into (A vs 0) by commuting the test. Disallow in the
// most general case because negating 0x80000000 does nothing. Needed for
// the CmpF3/SubI/CmpI idiom.
--- a/src/hotspot/share/runtime/arguments.cpp Wed Sep 26 18:36:55 2018 +0100
+++ b/src/hotspot/share/runtime/arguments.cpp Thu Sep 27 10:49:10 2018 -0700
@@ -542,6 +542,7 @@
{ "CreateMinidumpOnCrash", JDK_Version::jdk(9), JDK_Version::undefined(), JDK_Version::undefined() },
{ "MustCallLoadClassInternal", JDK_Version::jdk(10), JDK_Version::jdk(11), JDK_Version::jdk(12) },
{ "UnsyncloadClass", JDK_Version::jdk(10), JDK_Version::jdk(11), JDK_Version::jdk(12) },
+ { "TLABStats", JDK_Version::jdk(12), JDK_Version::undefined(), JDK_Version::undefined() },
// -------------- Obsolete Flags - sorted by expired_in --------------
{ "CheckAssertionStatusDirectives",JDK_Version::undefined(), JDK_Version::jdk(11), JDK_Version::jdk(12) },
@@ -577,6 +578,7 @@
{ "EmitSync", JDK_Version::undefined(), JDK_Version::jdk(12), JDK_Version::jdk(13) },
{ "SyncVerbose", JDK_Version::undefined(), JDK_Version::jdk(12), JDK_Version::jdk(13) },
{ "SyncFlags", JDK_Version::undefined(), JDK_Version::jdk(12), JDK_Version::jdk(13) },
+ { "SyncKnobs", JDK_Version::undefined(), JDK_Version::jdk(12), JDK_Version::jdk(13) },
#ifdef TEST_VERIFY_SPECIAL_JVM_FLAGS
{ "dep > obs", JDK_Version::jdk(9), JDK_Version::jdk(8), JDK_Version::undefined() },
--- a/src/hotspot/share/runtime/globals.hpp Wed Sep 26 18:36:55 2018 +0100
+++ b/src/hotspot/share/runtime/globals.hpp Thu Sep 27 10:49:10 2018 -0700
@@ -827,9 +827,6 @@
"Use LWP-based instead of libthread-based synchronization " \
"(SPARC only)") \
\
- experimental(ccstr, SyncKnobs, NULL, \
- "(Unstable) Various monitor synchronization tunables") \
- \
product(intx, MonitorBound, 0, "Bound Monitor population") \
range(0, max_jint) \
\
--- a/src/hotspot/share/runtime/objectMonitor.cpp Wed Sep 26 18:36:55 2018 +0100
+++ b/src/hotspot/share/runtime/objectMonitor.cpp Thu Sep 27 10:49:10 2018 -0700
@@ -101,39 +101,15 @@
// The knob* variables are effectively final. Once set they should
// never be modified hence. Consider using __read_mostly with GCC.
-int ObjectMonitor::Knob_ExitRelease = 0;
-int ObjectMonitor::Knob_InlineNotify = 1;
-int ObjectMonitor::Knob_Verbose = 0;
-int ObjectMonitor::Knob_VerifyInUse = 0;
-int ObjectMonitor::Knob_VerifyMatch = 0;
int ObjectMonitor::Knob_SpinLimit = 5000; // derived by an external tool -
-static int Knob_ReportSettings = 0;
-static int Knob_SpinBase = 0; // Floor AKA SpinMin
-static int Knob_SpinBackOff = 0; // spin-loop backoff
-static int Knob_CASPenalty = -1; // Penalty for failed CAS
-static int Knob_OXPenalty = -1; // Penalty for observed _owner change
-static int Knob_SpinSetSucc = 1; // spinners set the _succ field
-static int Knob_SpinEarly = 1;
-static int Knob_SuccEnabled = 1; // futile wake throttling
-static int Knob_SuccRestrict = 0; // Limit successors + spinners to at-most-one
-static int Knob_MaxSpinners = -1; // Should be a function of # CPUs
static int Knob_Bonus = 100; // spin success bonus
static int Knob_BonusB = 100; // spin success bonus
static int Knob_Penalty = 200; // spin failure penalty
static int Knob_Poverty = 1000;
-static int Knob_SpinAfterFutile = 1; // Spin after returning from park()
static int Knob_FixedSpin = 0;
-static int Knob_OState = 3; // Spinner checks thread state of _owner
-static int Knob_UsePause = 1;
-static int Knob_ExitPolicy = 0;
static int Knob_PreSpin = 10; // 20-100 likely better
-static int Knob_ResetEvent = 0;
-static int BackOffMask = 0;
-static int Knob_FastHSSEC = 0;
-static int Knob_MoveNotifyee = 2; // notify() - disposition of notifyee
-static int Knob_QMode = 0; // EntryList-cxq policy - queue discipline
static volatile int InitDone = 0;
// -----------------------------------------------------------------------------
@@ -299,7 +275,7 @@
// transitions. The following spin is strictly optional ...
// Note that if we acquire the monitor from an initial spin
// we forgo posting JVMTI events and firing DTRACE probes.
- if (Knob_SpinEarly && TrySpin (Self) > 0) {
+ if (TrySpin(Self) > 0) {
assert(_owner == Self, "invariant");
assert(_recursions == 0, "invariant");
assert(((oop)(object()))->mark() == markOopDesc::encode(this), "invariant");
@@ -461,7 +437,7 @@
// to the owner. This has subtle but beneficial affinity
// effects.
- if (TrySpin (Self) > 0) {
+ if (TrySpin(Self) > 0) {
assert(_owner == Self, "invariant");
assert(_succ != Self, "invariant");
assert(_Responsible != Self, "invariant");
@@ -583,20 +559,14 @@
// We can defer clearing _succ until after the spin completes
// TrySpin() must tolerate being called with _succ == Self.
// Try yet another round of adaptive spinning.
- if ((Knob_SpinAfterFutile & 1) && TrySpin(Self) > 0) break;
+ if (TrySpin(Self) > 0) break;
// We can find that we were unpark()ed and redesignated _succ while
// we were spinning. That's harmless. If we iterate and call park(),
// park() will consume the event and return immediately and we'll
// just spin again. This pattern can repeat, leaving _succ to simply
- // spin on a CPU. Enable Knob_ResetEvent to clear pending unparks().
- // Alternately, we can sample fired() here, and if set, forgo spinning
- // in the next iteration.
+ // spin on a CPU.
- if ((Knob_ResetEvent & 1) && Self->_ParkEvent->fired()) {
- Self->_ParkEvent->reset();
- OrderAccess::fence();
- }
if (_succ == Self) _succ = NULL;
// Invariant: after clearing _succ a thread *must* retry _owner before parking.
@@ -675,9 +645,7 @@
// contended slow-path from EnterI(). We use ReenterI() only for
// monitor reentry in wait().
//
-// In the future we should reconcile EnterI() and ReenterI(), adding
-// Knob_Reset and Knob_SpinAfterFutile support and restructuring the
-// loop accordingly.
+// In the future we should reconcile EnterI() and ReenterI().
void ObjectMonitor::ReenterI(Thread * Self, ObjectWaiter * SelfNode) {
assert(Self != NULL, "invariant");
@@ -929,181 +897,60 @@
for (;;) {
assert(THREAD == _owner, "invariant");
- if (Knob_ExitPolicy == 0) {
- // release semantics: prior loads and stores from within the critical section
- // must not float (reorder) past the following store that drops the lock.
- // On SPARC that requires MEMBAR #loadstore|#storestore.
- // But of course in TSO #loadstore|#storestore is not required.
- // I'd like to write one of the following:
- // A. OrderAccess::release() ; _owner = NULL
- // B. OrderAccess::loadstore(); OrderAccess::storestore(); _owner = NULL;
- // Unfortunately OrderAccess::release() and OrderAccess::loadstore() both
- // store into a _dummy variable. That store is not needed, but can result
- // in massive wasteful coherency traffic on classic SMP systems.
- // Instead, I use release_store(), which is implemented as just a simple
- // ST on x64, x86 and SPARC.
- OrderAccess::release_store(&_owner, (void*)NULL); // drop the lock
- OrderAccess::storeload(); // See if we need to wake a successor
- if ((intptr_t(_EntryList)|intptr_t(_cxq)) == 0 || _succ != NULL) {
- return;
- }
- // Other threads are blocked trying to acquire the lock.
+ // release semantics: prior loads and stores from within the critical section
+ // must not float (reorder) past the following store that drops the lock.
+ // On SPARC that requires MEMBAR #loadstore|#storestore.
+ // But of course in TSO #loadstore|#storestore is not required.
+ OrderAccess::release_store(&_owner, (void*)NULL); // drop the lock
+ OrderAccess::storeload(); // See if we need to wake a successor
+ if ((intptr_t(_EntryList)|intptr_t(_cxq)) == 0 || _succ != NULL) {
+ return;
+ }
+ // Other threads are blocked trying to acquire the lock.
- // Normally the exiting thread is responsible for ensuring succession,
- // but if other successors are ready or other entering threads are spinning
- // then this thread can simply store NULL into _owner and exit without
- // waking a successor. The existence of spinners or ready successors
- // guarantees proper succession (liveness). Responsibility passes to the
- // ready or running successors. The exiting thread delegates the duty.
- // More precisely, if a successor already exists this thread is absolved
- // of the responsibility of waking (unparking) one.
- //
- // The _succ variable is critical to reducing futile wakeup frequency.
- // _succ identifies the "heir presumptive" thread that has been made
- // ready (unparked) but that has not yet run. We need only one such
- // successor thread to guarantee progress.
- // See http://www.usenix.org/events/jvm01/full_papers/dice/dice.pdf
- // section 3.3 "Futile Wakeup Throttling" for details.
- //
- // Note that spinners in Enter() also set _succ non-null.
- // In the current implementation spinners opportunistically set
- // _succ so that exiting threads might avoid waking a successor.
- // Another less appealing alternative would be for the exiting thread
- // to drop the lock and then spin briefly to see if a spinner managed
- // to acquire the lock. If so, the exiting thread could exit
- // immediately without waking a successor, otherwise the exiting
- // thread would need to dequeue and wake a successor.
- // (Note that we'd need to make the post-drop spin short, but no
- // shorter than the worst-case round-trip cache-line migration time.
- // The dropped lock needs to become visible to the spinner, and then
- // the acquisition of the lock by the spinner must become visible to
- // the exiting thread).
+ // Normally the exiting thread is responsible for ensuring succession,
+ // but if other successors are ready or other entering threads are spinning
+ // then this thread can simply store NULL into _owner and exit without
+ // waking a successor. The existence of spinners or ready successors
+ // guarantees proper succession (liveness). Responsibility passes to the
+ // ready or running successors. The exiting thread delegates the duty.
+ // More precisely, if a successor already exists this thread is absolved
+ // of the responsibility of waking (unparking) one.
+ //
+ // The _succ variable is critical to reducing futile wakeup frequency.
+ // _succ identifies the "heir presumptive" thread that has been made
+ // ready (unparked) but that has not yet run. We need only one such
+ // successor thread to guarantee progress.
+ // See http://www.usenix.org/events/jvm01/full_papers/dice/dice.pdf
+ // section 3.3 "Futile Wakeup Throttling" for details.
+ //
+ // Note that spinners in Enter() also set _succ non-null.
+ // In the current implementation spinners opportunistically set
+ // _succ so that exiting threads might avoid waking a successor.
+ // Another less appealing alternative would be for the exiting thread
+ // to drop the lock and then spin briefly to see if a spinner managed
+ // to acquire the lock. If so, the exiting thread could exit
+ // immediately without waking a successor, otherwise the exiting
+ // thread would need to dequeue and wake a successor.
+ // (Note that we'd need to make the post-drop spin short, but no
+ // shorter than the worst-case round-trip cache-line migration time.
+ // The dropped lock needs to become visible to the spinner, and then
+ // the acquisition of the lock by the spinner must become visible to
+ // the exiting thread).
- // It appears that an heir-presumptive (successor) must be made ready.
- // Only the current lock owner can manipulate the EntryList or
- // drain _cxq, so we need to reacquire the lock. If we fail
- // to reacquire the lock the responsibility for ensuring succession
- // falls to the new owner.
- //
- if (!Atomic::replace_if_null(THREAD, &_owner)) {
- return;
- }
- } else {
- if ((intptr_t(_EntryList)|intptr_t(_cxq)) == 0 || _succ != NULL) {
- OrderAccess::release_store(&_owner, (void*)NULL); // drop the lock
- OrderAccess::storeload();
- // Ratify the previously observed values.
- if (_cxq == NULL || _succ != NULL) {
- return;
- }
-
- // inopportune interleaving -- the exiting thread (this thread)
- // in the fast-exit path raced an entering thread in the slow-enter
- // path.
- // We have two choices:
- // A. Try to reacquire the lock.
- // If the CAS() fails return immediately, otherwise
- // we either restart/rerun the exit operation, or simply
- // fall-through into the code below which wakes a successor.
- // B. If the elements forming the EntryList|cxq are TSM
- // we could simply unpark() the lead thread and return
- // without having set _succ.
- if (!Atomic::replace_if_null(THREAD, &_owner)) {
- return;
- }
- }
+ // It appears that an heir-presumptive (successor) must be made ready.
+ // Only the current lock owner can manipulate the EntryList or
+ // drain _cxq, so we need to reacquire the lock. If we fail
+ // to reacquire the lock the responsibility for ensuring succession
+ // falls to the new owner.
+ //
+ if (!Atomic::replace_if_null(THREAD, &_owner)) {
+ return;
}
guarantee(_owner == THREAD, "invariant");
ObjectWaiter * w = NULL;
- int QMode = Knob_QMode;
-
- if (QMode == 2 && _cxq != NULL) {
- // QMode == 2 : cxq has precedence over EntryList.
- // Try to directly wake a successor from the cxq.
- // If successful, the successor will need to unlink itself from cxq.
- w = _cxq;
- assert(w != NULL, "invariant");
- assert(w->TState == ObjectWaiter::TS_CXQ, "Invariant");
- ExitEpilog(Self, w);
- return;
- }
-
- if (QMode == 3 && _cxq != NULL) {
- // Aggressively drain cxq into EntryList at the first opportunity.
- // This policy ensure that recently-run threads live at the head of EntryList.
- // Drain _cxq into EntryList - bulk transfer.
- // First, detach _cxq.
- // The following loop is tantamount to: w = swap(&cxq, NULL)
- w = _cxq;
- for (;;) {
- assert(w != NULL, "Invariant");
- ObjectWaiter * u = Atomic::cmpxchg((ObjectWaiter*)NULL, &_cxq, w);
- if (u == w) break;
- w = u;
- }
- assert(w != NULL, "invariant");
-
- ObjectWaiter * q = NULL;
- ObjectWaiter * p;
- for (p = w; p != NULL; p = p->_next) {
- guarantee(p->TState == ObjectWaiter::TS_CXQ, "Invariant");
- p->TState = ObjectWaiter::TS_ENTER;
- p->_prev = q;
- q = p;
- }
-
- // Append the RATs to the EntryList
- // TODO: organize EntryList as a CDLL so we can locate the tail in constant-time.
- ObjectWaiter * Tail;
- for (Tail = _EntryList; Tail != NULL && Tail->_next != NULL;
- Tail = Tail->_next)
- /* empty */;
- if (Tail == NULL) {
- _EntryList = w;
- } else {
- Tail->_next = w;
- w->_prev = Tail;
- }
-
- // Fall thru into code that tries to wake a successor from EntryList
- }
-
- if (QMode == 4 && _cxq != NULL) {
- // Aggressively drain cxq into EntryList at the first opportunity.
- // This policy ensure that recently-run threads live at the head of EntryList.
-
- // Drain _cxq into EntryList - bulk transfer.
- // First, detach _cxq.
- // The following loop is tantamount to: w = swap(&cxq, NULL)
- w = _cxq;
- for (;;) {
- assert(w != NULL, "Invariant");
- ObjectWaiter * u = Atomic::cmpxchg((ObjectWaiter*)NULL, &_cxq, w);
- if (u == w) break;
- w = u;
- }
- assert(w != NULL, "invariant");
-
- ObjectWaiter * q = NULL;
- ObjectWaiter * p;
- for (p = w; p != NULL; p = p->_next) {
- guarantee(p->TState == ObjectWaiter::TS_CXQ, "Invariant");
- p->TState = ObjectWaiter::TS_ENTER;
- p->_prev = q;
- q = p;
- }
-
- // Prepend the RATs to the EntryList
- if (_EntryList != NULL) {
- q->_next = _EntryList;
- _EntryList->_prev = q;
- }
- _EntryList = w;
-
- // Fall thru into code that tries to wake a successor from EntryList
- }
w = _EntryList;
if (w != NULL) {
@@ -1150,34 +997,14 @@
// TODO-FIXME: consider changing EntryList from a DLL to a CDLL so
// we have faster access to the tail.
- if (QMode == 1) {
- // QMode == 1 : drain cxq to EntryList, reversing order
- // We also reverse the order of the list.
- ObjectWaiter * s = NULL;
- ObjectWaiter * t = w;
- ObjectWaiter * u = NULL;
- while (t != NULL) {
- guarantee(t->TState == ObjectWaiter::TS_CXQ, "invariant");
- t->TState = ObjectWaiter::TS_ENTER;
- u = t->_next;
- t->_prev = u;
- t->_next = s;
- s = t;
- t = u;
- }
- _EntryList = s;
- assert(s != NULL, "invariant");
- } else {
- // QMode == 0 or QMode == 2
- _EntryList = w;
- ObjectWaiter * q = NULL;
- ObjectWaiter * p;
- for (p = w; p != NULL; p = p->_next) {
- guarantee(p->TState == ObjectWaiter::TS_CXQ, "Invariant");
- p->TState = ObjectWaiter::TS_ENTER;
- p->_prev = q;
- q = p;
- }
+ _EntryList = w;
+ ObjectWaiter * q = NULL;
+ ObjectWaiter * p;
+ for (p = w; p != NULL; p = p->_next) {
+ guarantee(p->TState == ObjectWaiter::TS_CXQ, "Invariant");
+ p->TState = ObjectWaiter::TS_ENTER;
+ p->_prev = q;
+ q = p;
}
// In 1-0 mode we need: ST EntryList; MEMBAR #storestore; ST _owner = NULL
@@ -1226,22 +1053,8 @@
// ST Self->_suspend_equivalent = false
// MEMBAR
// LD Self_>_suspend_flags
-//
-// UPDATE 2007-10-6: since I've replaced the native Mutex/Monitor subsystem
-// with a more efficient implementation, the need to use "FastHSSEC" has
-// decreased. - Dave
-
bool ObjectMonitor::ExitSuspendEquivalent(JavaThread * jSelf) {
- const int Mode = Knob_FastHSSEC;
- if (Mode && !jSelf->is_external_suspend()) {
- assert(jSelf->is_suspend_equivalent(), "invariant");
- jSelf->clear_suspend_equivalent();
- if (2 == Mode) OrderAccess::storeload();
- if (!jSelf->is_external_suspend()) return false;
- // We raced a suspension -- fall thru into the slow path
- jSelf->set_suspend_equivalent();
- }
return jSelf->handle_special_suspend_equivalent_condition();
}
@@ -1255,7 +1068,7 @@
// 2. ST _owner = NULL
// 3. unpark(wakee)
- _succ = Knob_SuccEnabled ? Wakee->_thread : NULL;
+ _succ = Wakee->_thread;
ParkEvent * Trigger = Wakee->_event;
// Hygiene -- once we've set _owner = NULL we can't safely dereference Wakee again.
@@ -1348,12 +1161,6 @@
THROW_MSG(vmSymbols::java_lang_IllegalMonitorStateException(), "current thread not owner");
}
-static int Adjust(volatile int * adr, int dx) {
- int v;
- for (v = *adr; Atomic::cmpxchg(v + dx, adr, v) != v; v = *adr) /* empty */;
- return v;
-}
-
static void post_monitor_wait_event(EventJavaMonitorWait* event,
ObjectMonitor* monitor,
jlong notifier_tid,
@@ -1599,8 +1406,6 @@
// we might just dequeue a thread from the WaitSet and directly unpark() it.
void ObjectMonitor::INotify(Thread * Self) {
- const int policy = Knob_MoveNotifyee;
-
Thread::SpinAcquire(&_WaitSetLock, "WaitSet - notify");
ObjectWaiter * iterator = DequeueWaiter();
if (iterator != NULL) {
@@ -1611,9 +1416,9 @@
// or head (policy == 0).
// b. push it onto the front of the _cxq (policy == 2).
// For now we use (b).
- if (policy != 4) {
- iterator->TState = ObjectWaiter::TS_ENTER;
- }
+
+ iterator->TState = ObjectWaiter::TS_ENTER;
+
iterator->_notified = 1;
iterator->_notifier_tid = JFR_THREAD_ID(Self);
@@ -1624,67 +1429,19 @@
assert(list != iterator, "invariant");
}
- if (policy == 0) { // prepend to EntryList
- if (list == NULL) {
- iterator->_next = iterator->_prev = NULL;
- _EntryList = iterator;
- } else {
- list->_prev = iterator;
- iterator->_next = list;
- iterator->_prev = NULL;
- _EntryList = iterator;
- }
- } else if (policy == 1) { // append to EntryList
- if (list == NULL) {
- iterator->_next = iterator->_prev = NULL;
- _EntryList = iterator;
- } else {
- // CONSIDER: finding the tail currently requires a linear-time walk of
- // the EntryList. We can make tail access constant-time by converting to
- // a CDLL instead of using our current DLL.
- ObjectWaiter * tail;
- for (tail = list; tail->_next != NULL; tail = tail->_next) {}
- assert(tail != NULL && tail->_next == NULL, "invariant");
- tail->_next = iterator;
- iterator->_prev = tail;
- iterator->_next = NULL;
- }
- } else if (policy == 2) { // prepend to cxq
- if (list == NULL) {
- iterator->_next = iterator->_prev = NULL;
- _EntryList = iterator;
- } else {
- iterator->TState = ObjectWaiter::TS_CXQ;
- for (;;) {
- ObjectWaiter * front = _cxq;
- iterator->_next = front;
- if (Atomic::cmpxchg(iterator, &_cxq, front) == front) {
- break;
- }
- }
- }
- } else if (policy == 3) { // append to cxq
+ // prepend to cxq
+ if (list == NULL) {
+ iterator->_next = iterator->_prev = NULL;
+ _EntryList = iterator;
+ } else {
iterator->TState = ObjectWaiter::TS_CXQ;
for (;;) {
- ObjectWaiter * tail = _cxq;
- if (tail == NULL) {
- iterator->_next = NULL;
- if (Atomic::replace_if_null(iterator, &_cxq)) {
- break;
- }
- } else {
- while (tail->_next != NULL) tail = tail->_next;
- tail->_next = iterator;
- iterator->_prev = tail;
- iterator->_next = NULL;
+ ObjectWaiter * front = _cxq;
+ iterator->_next = front;
+ if (Atomic::cmpxchg(iterator, &_cxq, front) == front) {
break;
}
}
- } else {
- ParkEvent * ev = iterator->_event;
- iterator->TState = ObjectWaiter::TS_RUN;
- OrderAccess::fence();
- ev->unpark();
}
// _WaitSetLock protects the wait queue, not the EntryList. We could
@@ -1695,9 +1452,7 @@
// on _WaitSetLock so it's not profitable to reduce the length of the
// critical section.
- if (policy < 4) {
- iterator->wait_reenter_begin(this);
- }
+ iterator->wait_reenter_begin(this);
}
Thread::SpinRelease(&_WaitSetLock);
}
@@ -1854,33 +1609,19 @@
// hold the duration constant but vary the frequency.
ctr = _SpinDuration;
- if (ctr < Knob_SpinBase) ctr = Knob_SpinBase;
if (ctr <= 0) return 0;
- if (Knob_SuccRestrict && _succ != NULL) return 0;
- if (Knob_OState && NotRunnable (Self, (Thread *) _owner)) {
+ if (NotRunnable(Self, (Thread *) _owner)) {
return 0;
}
- int MaxSpin = Knob_MaxSpinners;
- if (MaxSpin >= 0) {
- if (_Spinner > MaxSpin) {
- return 0;
- }
- // Slightly racy, but benign ...
- Adjust(&_Spinner, 1);
- }
-
// We're good to spin ... spin ingress.
// CONSIDER: use Prefetch::write() to avoid RTS->RTO upgrades
// when preparing to LD...CAS _owner, etc and the CAS is likely
// to succeed.
- int hits = 0;
- int msk = 0;
- int caspty = Knob_CASPenalty;
- int oxpty = Knob_OXPenalty;
- int sss = Knob_SpinSetSucc;
- if (sss && _succ == NULL) _succ = Self;
+ if (_succ == NULL) {
+ _succ = Self;
+ }
Thread * prv = NULL;
// There are three ways to exit the following loop:
@@ -1903,32 +1644,7 @@
if (SafepointMechanism::poll(Self)) {
goto Abort; // abrupt spin egress
}
- if (Knob_UsePause & 1) SpinPause();
- }
-
- if (Knob_UsePause & 2) SpinPause();
-
- // Exponential back-off ... Stay off the bus to reduce coherency traffic.
- // This is useful on classic SMP systems, but is of less utility on
- // N1-style CMT platforms.
- //
- // Trade-off: lock acquisition latency vs coherency bandwidth.
- // Lock hold times are typically short. A histogram
- // of successful spin attempts shows that we usually acquire
- // the lock early in the spin. That suggests we want to
- // sample _owner frequently in the early phase of the spin,
- // but then back-off and sample less frequently as the spin
- // progresses. The back-off makes a good citizen on SMP big
- // SMP systems. Oversampling _owner can consume excessive
- // coherency bandwidth. Relatedly, if we _oversample _owner we
- // can inadvertently interfere with the the ST m->owner=null.
- // executed by the lock owner.
- if (ctr & msk) continue;
- ++hits;
- if ((hits & 0xF) == 0) {
- // The 0xF, above, corresponds to the exponent.
- // Consider: (msk+1)|msk
- msk = ((msk << 2)|3) & BackOffMask;
+ SpinPause();
}
// Probe _owner with TATAS
@@ -1947,10 +1663,9 @@
if (ox == NULL) {
// The CAS succeeded -- this thread acquired ownership
// Take care of some bookkeeping to exit spin state.
- if (sss && _succ == Self) {
+ if (_succ == Self) {
_succ = NULL;
}
- if (MaxSpin > 0) Adjust(&_Spinner, -1);
// Increase _SpinDuration :
// The spin was successful (profitable) so we tend toward
@@ -1968,22 +1683,17 @@
}
// The CAS failed ... we can take any of the following actions:
- // * penalize: ctr -= Knob_CASPenalty
+ // * penalize: ctr -= CASPenalty
// * exit spin with prejudice -- goto Abort;
// * exit spin without prejudice.
// * Since CAS is high-latency, retry again immediately.
prv = ox;
- if (caspty == -2) break;
- if (caspty == -1) goto Abort;
- ctr -= caspty;
- continue;
+ goto Abort;
}
// Did lock ownership change hands ?
if (ox != prv && prv != NULL) {
- if (oxpty == -2) break;
- if (oxpty == -1) goto Abort;
- ctr -= oxpty;
+ goto Abort;
}
prv = ox;
@@ -1991,10 +1701,12 @@
// The owner must be executing in order to drop the lock.
// Spinning while the owner is OFFPROC is idiocy.
// Consider: ctr -= RunnablePenalty ;
- if (Knob_OState && NotRunnable (Self, ox)) {
+ if (NotRunnable(Self, ox)) {
goto Abort;
}
- if (sss && _succ == NULL) _succ = Self;
+ if (_succ == NULL) {
+ _succ = Self;
+ }
}
// Spin failed with prejudice -- reduce _SpinDuration.
@@ -2012,8 +1724,7 @@
}
Abort:
- if (MaxSpin >= 0) Adjust(&_Spinner, -1);
- if (sss && _succ == Self) {
+ if (_succ == Self) {
_succ = NULL;
// Invariant: after setting succ=null a contending thread
// must recheck-retry _owner before parking. This usually happens
@@ -2204,29 +1915,6 @@
}
}
-static char * kvGet(char * kvList, const char * Key) {
- if (kvList == NULL) return NULL;
- size_t n = strlen(Key);
- char * Search;
- for (Search = kvList; *Search; Search += strlen(Search) + 1) {
- if (strncmp (Search, Key, n) == 0) {
- if (Search[n] == '=') return Search + n + 1;
- if (Search[n] == 0) return(char *) "1";
- }
- }
- return NULL;
-}
-
-static int kvGetInt(char * kvList, const char * Key, int Default) {
- char * v = kvGet(kvList, Key);
- int rslt = v ? ::strtol(v, NULL, 0) : Default;
- if (Knob_ReportSettings && v != NULL) {
- tty->print_cr("INFO: SyncKnob: %s %d(%d)", Key, rslt, Default) ;
- tty->flush();
- }
- return rslt;
-}
-
void ObjectMonitor::DeferredInitialize() {
if (InitDone > 0) return;
if (Atomic::cmpxchg (-1, &InitDone, 0) != 0) {
@@ -2237,70 +1925,13 @@
// One-shot global initialization ...
// The initialization is idempotent, so we don't need locks.
// In the future consider doing this via os::init_2().
- // SyncKnobs consist of <Key>=<Value> pairs in the style
- // of environment variables. Start by converting ':' to NUL.
- if (SyncKnobs == NULL) SyncKnobs = "";
-
- size_t sz = strlen(SyncKnobs);
- char * knobs = (char *) os::malloc(sz + 2, mtInternal);
- if (knobs == NULL) {
- vm_exit_out_of_memory(sz + 2, OOM_MALLOC_ERROR, "Parse SyncKnobs");
- guarantee(0, "invariant");
- }
- strcpy(knobs, SyncKnobs);
- knobs[sz+1] = 0;
- for (char * p = knobs; *p; p++) {
- if (*p == ':') *p = 0;
- }
-
- #define SETKNOB(x) { Knob_##x = kvGetInt(knobs, #x, Knob_##x); }
- SETKNOB(ReportSettings);
- SETKNOB(ExitRelease);
- SETKNOB(InlineNotify);
- SETKNOB(Verbose);
- SETKNOB(VerifyInUse);
- SETKNOB(VerifyMatch);
- SETKNOB(FixedSpin);
- SETKNOB(SpinLimit);
- SETKNOB(SpinBase);
- SETKNOB(SpinBackOff);
- SETKNOB(CASPenalty);
- SETKNOB(OXPenalty);
- SETKNOB(SpinSetSucc);
- SETKNOB(SuccEnabled);
- SETKNOB(SuccRestrict);
- SETKNOB(Penalty);
- SETKNOB(Bonus);
- SETKNOB(BonusB);
- SETKNOB(Poverty);
- SETKNOB(SpinAfterFutile);
- SETKNOB(UsePause);
- SETKNOB(SpinEarly);
- SETKNOB(OState);
- SETKNOB(MaxSpinners);
- SETKNOB(PreSpin);
- SETKNOB(ExitPolicy);
- SETKNOB(QMode);
- SETKNOB(ResetEvent);
- SETKNOB(MoveNotifyee);
- SETKNOB(FastHSSEC);
- #undef SETKNOB
-
- if (os::is_MP()) {
- BackOffMask = (1 << Knob_SpinBackOff) - 1;
- if (Knob_ReportSettings) {
- tty->print_cr("INFO: BackOffMask=0x%X", BackOffMask);
- }
- // CONSIDER: BackOffMask = ROUNDUP_NEXT_POWER2 (ncpus-1)
- } else {
+ if (!os::is_MP()) {
Knob_SpinLimit = 0;
- Knob_SpinBase = 0;
Knob_PreSpin = 0;
Knob_FixedSpin = -1;
}
- os::free(knobs);
OrderAccess::fence();
InitDone = 1;
}
--- a/src/hotspot/share/runtime/objectMonitor.hpp Wed Sep 26 18:36:55 2018 +0100
+++ b/src/hotspot/share/runtime/objectMonitor.hpp Thu Sep 27 10:49:10 2018 -0700
@@ -195,11 +195,6 @@
static PerfCounter * _sync_Deflations;
static PerfLongVariable * _sync_MonExtant;
- static int Knob_ExitRelease;
- static int Knob_InlineNotify;
- static int Knob_Verbose;
- static int Knob_VerifyInUse;
- static int Knob_VerifyMatch;
static int Knob_SpinLimit;
void* operator new (size_t size) throw();
--- a/src/hotspot/share/runtime/safepoint.cpp Wed Sep 26 18:36:55 2018 +0100
+++ b/src/hotspot/share/runtime/safepoint.cpp Thu Sep 27 10:49:10 2018 -0700
@@ -598,7 +598,8 @@
public:
ParallelSPCleanupThreadClosure(DeflateMonitorCounters* counters) :
- _nmethod_cl(NMethodSweeper::prepare_mark_active_nmethods()), _counters(counters) {}
+ _nmethod_cl(UseCodeAging ? NMethodSweeper::prepare_reset_hotness_counters() : NULL),
+ _counters(counters) {}
void do_thread(Thread* thread) {
ObjectSynchronizer::deflate_thread_local_monitors(thread, _counters);
--- a/src/hotspot/share/runtime/sweeper.cpp Wed Sep 26 18:36:55 2018 +0100
+++ b/src/hotspot/share/runtime/sweeper.cpp Thu Sep 27 10:49:10 2018 -0700
@@ -28,15 +28,19 @@
#include "code/icBuffer.hpp"
#include "code/nmethod.hpp"
#include "compiler/compileBroker.hpp"
+#include "gc/shared/collectedHeap.hpp"
+#include "gc/shared/workgroup.hpp"
#include "jfr/jfrEvents.hpp"
#include "logging/log.hpp"
#include "logging/logStream.hpp"
#include "memory/allocation.inline.hpp"
#include "memory/resourceArea.hpp"
+#include "memory/universe.hpp"
#include "oops/method.hpp"
#include "runtime/atomic.hpp"
#include "runtime/compilationPolicy.hpp"
#include "runtime/interfaceSupport.inline.hpp"
+#include "runtime/handshake.hpp"
#include "runtime/mutexLocker.hpp"
#include "runtime/orderAccess.hpp"
#include "runtime/os.hpp"
@@ -197,6 +201,38 @@
return _current.end();
}
+class NMethodMarkingThreadClosure : public ThreadClosure {
+private:
+ CodeBlobClosure* _cl;
+public:
+ NMethodMarkingThreadClosure(CodeBlobClosure* cl) : _cl(cl) {}
+ void do_thread(Thread* thread) {
+ if (thread->is_Java_thread() && ! thread->is_Code_cache_sweeper_thread()) {
+ JavaThread* jt = (JavaThread*) thread;
+ jt->nmethods_do(_cl);
+ }
+ }
+};
+
+class NMethodMarkingTask : public AbstractGangTask {
+private:
+ NMethodMarkingThreadClosure* _cl;
+public:
+ NMethodMarkingTask(NMethodMarkingThreadClosure* cl) :
+ AbstractGangTask("Parallel NMethod Marking"),
+ _cl(cl) {
+ Threads::change_thread_claim_parity();
+ }
+
+ ~NMethodMarkingTask() {
+ Threads::assert_all_threads_claimed();
+ }
+
+ void work(uint worker_id) {
+ Threads::possibly_parallel_threads_do(true, _cl);
+ }
+};
+
/**
* Scans the stacks of all Java threads and marks activations of not-entrant methods.
* No need to synchronize access, since 'mark_active_nmethods' is always executed at a
@@ -205,12 +241,56 @@
void NMethodSweeper::mark_active_nmethods() {
CodeBlobClosure* cl = prepare_mark_active_nmethods();
if (cl != NULL) {
- Threads::nmethods_do(cl);
+ WorkGang* workers = Universe::heap()->get_safepoint_workers();
+ if (workers != NULL) {
+ NMethodMarkingThreadClosure tcl(cl);
+ NMethodMarkingTask task(&tcl);
+ workers->run_task(&task);
+ } else {
+ Threads::nmethods_do(cl);
+ }
}
}
CodeBlobClosure* NMethodSweeper::prepare_mark_active_nmethods() {
+#ifdef ASSERT
+ if (ThreadLocalHandshakes) {
+ assert(Thread::current()->is_Code_cache_sweeper_thread(), "must be executed under CodeCache_lock and in sweeper thread");
+ assert_lock_strong(CodeCache_lock);
+ } else {
+ assert(SafepointSynchronize::is_at_safepoint(), "must be executed at a safepoint");
+ }
+#endif
+
+ // If we do not want to reclaim not-entrant or zombie methods there is no need
+ // to scan stacks
+ if (!MethodFlushing) {
+ return NULL;
+ }
+
+ // Increase time so that we can estimate when to invoke the sweeper again.
+ _time_counter++;
+
+ // Check for restart
+ assert(_current.method() == NULL, "should only happen between sweeper cycles");
+ assert(wait_for_stack_scanning(), "should only happen between sweeper cycles");
+
+ _seen = 0;
+ _current = CompiledMethodIterator();
+ // Initialize to first nmethod
+ _current.next();
+ _traversals += 1;
+ _total_time_this_sweep = Tickspan();
+
+ if (PrintMethodFlushing) {
+ tty->print_cr("### Sweep: stack traversal %ld", _traversals);
+ }
+ return &mark_activation_closure;
+}
+
+CodeBlobClosure* NMethodSweeper::prepare_reset_hotness_counters() {
assert(SafepointSynchronize::is_at_safepoint(), "must be executed at a safepoint");
+
// If we do not want to reclaim not-entrant or zombie methods there is no need
// to scan stacks
if (!MethodFlushing) {
@@ -231,24 +311,7 @@
}
}
- if (wait_for_stack_scanning()) {
- _seen = 0;
- _current = CompiledMethodIterator();
- // Initialize to first nmethod
- _current.next();
- _traversals += 1;
- _total_time_this_sweep = Tickspan();
-
- if (PrintMethodFlushing) {
- tty->print_cr("### Sweep: stack traversal %ld", _traversals);
- }
- return &mark_activation_closure;
-
- } else {
- // Only set hotness counter
- return &set_hotness_closure;
- }
-
+ return &set_hotness_closure;
}
/**
@@ -258,8 +321,20 @@
void NMethodSweeper::do_stack_scanning() {
assert(!CodeCache_lock->owned_by_self(), "just checking");
if (wait_for_stack_scanning()) {
- VM_MarkActiveNMethods op;
- VMThread::execute(&op);
+ if (ThreadLocalHandshakes) {
+ CodeBlobClosure* code_cl;
+ {
+ MutexLockerEx ccl(CodeCache_lock, Mutex::_no_safepoint_check_flag);
+ code_cl = prepare_mark_active_nmethods();
+ }
+ if (code_cl != NULL) {
+ NMethodMarkingThreadClosure tcl(code_cl);
+ Handshake::execute(&tcl);
+ }
+ } else {
+ VM_MarkActiveNMethods op;
+ VMThread::execute(&op);
+ }
_should_sweep = true;
}
}
--- a/src/hotspot/share/runtime/sweeper.hpp Wed Sep 26 18:36:55 2018 +0100
+++ b/src/hotspot/share/runtime/sweeper.hpp Thu Sep 27 10:49:10 2018 -0700
@@ -117,6 +117,7 @@
static void mark_active_nmethods(); // Invoked at the end of each safepoint
static CodeBlobClosure* prepare_mark_active_nmethods();
+ static CodeBlobClosure* prepare_reset_hotness_counters();
static void sweeper_loop();
static void notify(int code_blob_type); // Possibly start the sweeper thread.
static void force_sweep();
--- a/src/hotspot/share/runtime/synchronizer.cpp Wed Sep 26 18:36:55 2018 +0100
+++ b/src/hotspot/share/runtime/synchronizer.cpp Thu Sep 27 10:49:10 2018 -0700
@@ -1050,40 +1050,14 @@
// TODO: assert thread state is reasonable
if (ForceMonitorScavenge == 0 && Atomic::xchg (1, &ForceMonitorScavenge) == 0) {
- if (ObjectMonitor::Knob_Verbose) {
- tty->print_cr("INFO: Monitor scavenge - Induced STW @%s (%d)",
- Whence, ForceMonitorScavenge) ;
- tty->flush();
- }
// Induce a 'null' safepoint to scavenge monitors
// Must VM_Operation instance be heap allocated as the op will be enqueue and posted
// to the VMthread and have a lifespan longer than that of this activation record.
// The VMThread will delete the op when completed.
VMThread::execute(new VM_ScavengeMonitors());
-
- if (ObjectMonitor::Knob_Verbose) {
- tty->print_cr("INFO: Monitor scavenge - STW posted @%s (%d)",
- Whence, ForceMonitorScavenge) ;
- tty->flush();
- }
}
}
-void ObjectSynchronizer::verifyInUse(Thread *Self) {
- ObjectMonitor* mid;
- int in_use_tally = 0;
- for (mid = Self->omInUseList; mid != NULL; mid = mid->FreeNext) {
- in_use_tally++;
- }
- assert(in_use_tally == Self->omInUseCount, "in-use count off");
-
- int free_tally = 0;
- for (mid = Self->omFreeList; mid != NULL; mid = mid->FreeNext) {
- free_tally++;
- }
- assert(free_tally == Self->omFreeCount, "free count off");
-}
-
ObjectMonitor* ObjectSynchronizer::omAlloc(Thread * Self) {
// A large MAXPRIVATE value reduces both list lock contention
// and list coherency traffic, but also tends to increase the
@@ -1110,9 +1084,6 @@
m->FreeNext = Self->omInUseList;
Self->omInUseList = m;
Self->omInUseCount++;
- if (ObjectMonitor::Knob_VerifyInUse) {
- verifyInUse(Self);
- }
} else {
m->FreeNext = NULL;
}
@@ -1250,9 +1221,6 @@
}
extracted = true;
Self->omInUseCount--;
- if (ObjectMonitor::Knob_VerifyInUse) {
- verifyInUse(Self);
- }
break;
}
}
@@ -1763,14 +1731,6 @@
// Consider: audit gFreeList to ensure that gMonitorFreeCount and list agree.
- if (ObjectMonitor::Knob_Verbose) {
- tty->print_cr("INFO: Deflate: InCirc=%d InUse=%d Scavenged=%d "
- "ForceMonitorScavenge=%d : pop=%d free=%d",
- counters->nInCirculation, counters->nInuse, counters->nScavenged, ForceMonitorScavenge,
- gMonitorPopulation, gMonitorFreeCount);
- tty->flush();
- }
-
ForceMonitorScavenge = 0; // Reset
OM_PERFDATA_OP(Deflations, inc(counters->nScavenged));
@@ -1796,9 +1756,6 @@
// Adjust counters
counters->nInCirculation += thread->omInUseCount;
thread->omInUseCount -= deflated_count;
- if (ObjectMonitor::Knob_VerifyInUse) {
- verifyInUse(thread);
- }
counters->nScavenged += deflated_count;
counters->nInuse += thread->omInUseCount;
@@ -1827,15 +1784,6 @@
ReleaseJavaMonitorsClosure(Thread* thread) : THREAD(thread) {}
void do_monitor(ObjectMonitor* mid) {
if (mid->owner() == THREAD) {
- if (ObjectMonitor::Knob_VerifyMatch != 0) {
- ResourceMark rm;
- Handle obj(THREAD, (oop) mid->object());
- tty->print("INFO: unexpected locked object:");
- javaVFrame::print_locked_object_class_name(tty, obj, "locked");
- fatal("exiting JavaThread=" INTPTR_FORMAT
- " unexpectedly owns ObjectMonitor=" INTPTR_FORMAT,
- p2i(THREAD), p2i(mid));
- }
(void)mid->complete_exit(CHECK);
}
}
--- a/src/hotspot/share/runtime/synchronizer.hpp Wed Sep 26 18:36:55 2018 +0100
+++ b/src/hotspot/share/runtime/synchronizer.hpp Thu Sep 27 10:49:10 2018 -0700
@@ -105,7 +105,6 @@
static void reenter (Handle obj, intptr_t recursion, TRAPS);
// thread-specific and global objectMonitor free list accessors
- static void verifyInUse(Thread * Self);
static ObjectMonitor * omAlloc(Thread * Self);
static void omRelease(Thread * Self, ObjectMonitor * m,
bool FromPerThreadAlloc);
--- a/src/hotspot/share/runtime/thread.cpp Wed Sep 26 18:36:55 2018 +0100
+++ b/src/hotspot/share/runtime/thread.cpp Thu Sep 27 10:49:10 2018 -0700
@@ -1953,13 +1953,9 @@
// between JNI-acquired and regular Java monitors. We can only see
// regular Java monitors here if monitor enter-exit matching is broken.
//
- // Optionally release any monitors for regular JavaThread exits. This
- // is provided as a work around for any bugs in monitor enter-exit
- // matching. This can be expensive so it is not enabled by default.
- //
// ensure_join() ignores IllegalThreadStateExceptions, and so does
// ObjectSynchronizer::release_monitors_owned_by_thread().
- if (exit_type == jni_detach || ObjectMonitor::Knob_ExitRelease) {
+ if (exit_type == jni_detach) {
// Sanity check even though JNI DetachCurrentThread() would have
// returned JNI_ERR if there was a Java frame. JavaThread exit
// should be done executing Java code by the time we get here.
--- a/src/hotspot/share/runtime/vframe.cpp Wed Sep 26 18:36:55 2018 +0100
+++ b/src/hotspot/share/runtime/vframe.cpp Thu Sep 27 10:49:10 2018 -0700
@@ -255,11 +255,6 @@
}
}
print_locked_object_class_name(st, Handle(THREAD, monitor->owner()), lock_state);
- if (ObjectMonitor::Knob_Verbose && mark != NULL) {
- st->print("\t- lockbits=");
- mark->print_on(st);
- st->cr();
- }
found_first_monitor = true;
}
--- a/src/hotspot/share/runtime/vm_version.cpp Wed Sep 26 18:36:55 2018 +0100
+++ b/src/hotspot/share/runtime/vm_version.cpp Thu Sep 27 10:49:10 2018 -0700
@@ -220,6 +220,8 @@
#define HOTSPOT_BUILD_COMPILER "MS VC++ 14.0 (VS2015)"
#elif _MSC_VER == 1912
#define HOTSPOT_BUILD_COMPILER "MS VC++ 15.5 (VS2017)"
+ #elif _MSC_VER == 1913
+ #define HOTSPOT_BUILD_COMPILER "MS VC++ 15.6 (VS2017)"
#else
#define HOTSPOT_BUILD_COMPILER "unknown MS VC++:" XSTR(_MSC_VER)
#endif
--- a/src/java.base/share/classes/java/time/format/DateTimeFormatterBuilder.java Wed Sep 26 18:36:55 2018 +0100
+++ b/src/java.base/share/classes/java/time/format/DateTimeFormatterBuilder.java Thu Sep 27 10:49:10 2018 -0700
@@ -802,7 +802,13 @@
return store.getText(value, style);
}
@Override
- public Iterator<Entry<String, Long>> getTextIterator(TemporalField field, TextStyle style, Locale locale) {
+ public Iterator<Entry<String, Long>> getTextIterator(Chronology chrono,
+ TemporalField field, TextStyle style, Locale locale) {
+ return store.getTextIterator(style);
+ }
+ @Override
+ public Iterator<Entry<String, Long>> getTextIterator(TemporalField field,
+ TextStyle style, Locale locale) {
return store.getTextIterator(style);
}
};
--- a/src/java.base/share/classes/java/util/Arrays.java Wed Sep 26 18:36:55 2018 +0100
+++ b/src/java.base/share/classes/java/util/Arrays.java Thu Sep 27 10:49:10 2018 -0700
@@ -28,6 +28,7 @@
import jdk.internal.HotSpotIntrinsicCandidate;
import jdk.internal.util.ArraysSupport;
+import java.io.Serializable;
import java.lang.reflect.Array;
import java.util.concurrent.ForkJoinPool;
import java.util.function.BinaryOperator;
@@ -4288,21 +4289,41 @@
// Misc
/**
- * Returns a fixed-size list backed by the specified array. (Changes to
- * the returned list "write through" to the array.) This method acts
- * as bridge between array-based and collection-based APIs, in
- * combination with {@link Collection#toArray}. The returned list is
- * serializable and implements {@link RandomAccess}.
+ * Returns a fixed-size list backed by the specified array. Changes made to
+ * the array will be visible in the returned list, and changes made to the
+ * list will be visible in the array. The returned list is
+ * {@link Serializable} and implements {@link RandomAccess}.
+ *
+ * <p>The returned list implements the optional {@code Collection} methods, except
+ * those that would change the size of the returned list. Those methods leave
+ * the list unchanged and throw {@link UnsupportedOperationException}.
+ *
+ * @apiNote
+ * This method acts as bridge between array-based and collection-based
+ * APIs, in combination with {@link Collection#toArray}.
+ *
+ * <p>This method provides a way to wrap an existing array:
+ * <pre>{@code
+ * Integer[] numbers = ...
+ * ...
+ * List<Integer> values = Arrays.asList(numbers);
+ * }</pre>
*
* <p>This method also provides a convenient way to create a fixed-size
* list initialized to contain several elements:
- * <pre>
- * List<String> stooges = Arrays.asList("Larry", "Moe", "Curly");
- * </pre>
+ * <pre>{@code
+ * List<String> stooges = Arrays.asList("Larry", "Moe", "Curly");
+ * }</pre>
+ *
+ * <p><em>The list returned by this method is modifiable.</em>
+ * To create an unmodifiable list, use
+ * {@link Collections#unmodifiableList Collections.unmodifiableList}
+ * or <a href="List.html#unmodifiable">Unmodifiable Lists</a>.
*
* @param <T> the class of the objects in the array
* @param a the array by which the list will be backed
* @return a list view of the specified array
+ * @throws NullPointerException if the specified array is {@code null}
*/
@SafeVarargs
@SuppressWarnings("varargs")
--- a/src/java.base/share/classes/java/util/jar/Attributes.java Wed Sep 26 18:36:55 2018 +0100
+++ b/src/java.base/share/classes/java/util/jar/Attributes.java Thu Sep 27 10:49:10 2018 -0700
@@ -369,8 +369,12 @@
* Reads attributes from the specified input stream.
* XXX Need to handle UTF8 values.
*/
+ void read(Manifest.FastInputStream is, byte[] lbuf) throws IOException {
+ read(is, lbuf, null, 0);
+ }
+
@SuppressWarnings("deprecation")
- void read(Manifest.FastInputStream is, byte[] lbuf) throws IOException {
+ int read(Manifest.FastInputStream is, byte[] lbuf, String filename, int lineNumber) throws IOException {
String name = null, value;
byte[] lastline = null;
@@ -378,8 +382,11 @@
while ((len = is.readLine(lbuf)) != -1) {
boolean lineContinued = false;
byte c = lbuf[--len];
+ lineNumber++;
+
if (c != '\n' && c != '\r') {
- throw new IOException("line too long");
+ throw new IOException("line too long ("
+ + Manifest.getErrorPosition(filename, lineNumber) + ")");
}
if (len > 0 && lbuf[len-1] == '\r') {
--len;
@@ -391,7 +398,8 @@
if (lbuf[0] == ' ') {
// continuation of previous line
if (name == null) {
- throw new IOException("misplaced continuation line");
+ throw new IOException("misplaced continuation line ("
+ + Manifest.getErrorPosition(filename, lineNumber) + ")");
}
lineContinued = true;
byte[] buf = new byte[lastline.length + len - 1];
@@ -406,11 +414,13 @@
} else {
while (lbuf[i++] != ':') {
if (i >= len) {
- throw new IOException("invalid header field");
+ throw new IOException("invalid header field ("
+ + Manifest.getErrorPosition(filename, lineNumber) + ")");
}
}
if (lbuf[i++] != ' ') {
- throw new IOException("invalid header field");
+ throw new IOException("invalid header field ("
+ + Manifest.getErrorPosition(filename, lineNumber) + ")");
}
name = new String(lbuf, 0, 0, i - 2);
if (is.peek() == ' ') {
@@ -433,9 +443,11 @@
+ "entry in the jar file.");
}
} catch (IllegalArgumentException e) {
- throw new IOException("invalid header field name: " + name);
+ throw new IOException("invalid header field name: " + name
+ + " (" + Manifest.getErrorPosition(filename, lineNumber) + ")");
}
}
+ return lineNumber;
}
/**
--- a/src/java.base/share/classes/java/util/jar/JarFile.java Wed Sep 26 18:36:55 2018 +0100
+++ b/src/java.base/share/classes/java/util/jar/JarFile.java Thu Sep 27 10:49:10 2018 -0700
@@ -417,12 +417,12 @@
if (manEntry != null) {
if (verify) {
byte[] b = getBytes(manEntry);
- man = new Manifest(new ByteArrayInputStream(b));
+ man = new Manifest(new ByteArrayInputStream(b), getName());
if (!jvInitialized) {
jv = new JarVerifier(b);
}
} else {
- man = new Manifest(super.getInputStream(manEntry));
+ man = new Manifest(super.getInputStream(manEntry), getName());
}
manRef = new SoftReference<>(man);
}
--- a/src/java.base/share/classes/java/util/jar/Manifest.java Wed Sep 26 18:36:55 2018 +0100
+++ b/src/java.base/share/classes/java/util/jar/Manifest.java Thu Sep 27 10:49:10 2018 -0700
@@ -25,14 +25,15 @@
package java.util.jar;
+import java.io.DataOutputStream;
import java.io.FilterInputStream;
-import java.io.DataOutputStream;
+import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
-import java.io.IOException;
+import java.util.HashMap;
import java.util.Map;
-import java.util.HashMap;
-import java.util.Iterator;
+
+import sun.security.util.SecurityProperties;
/**
* The Manifest class is used to maintain Manifest entry names and their
@@ -47,16 +48,24 @@
* @since 1.2
*/
public class Manifest implements Cloneable {
+
+ private static final boolean jarInfoInExceptionText =
+ SecurityProperties.includedInExceptions("jar");
+
// manifest main attributes
private Attributes attr = new Attributes();
// manifest entries
private Map<String, Attributes> entries = new HashMap<>();
+ // name of the corresponding jar archive if available.
+ private final String jarFilename;
+
/**
* Constructs a new, empty Manifest.
*/
public Manifest() {
+ jarFilename = null;
}
/**
@@ -66,15 +75,29 @@
* @throws IOException if an I/O error has occurred
*/
public Manifest(InputStream is) throws IOException {
+ this();
read(is);
}
/**
+ * Constructs a new Manifest from the specified input stream.
+ *
+ * @param is the input stream containing manifest data
+ * @param jarFilename the name of the corresponding jar archive if available
+ * @throws IOException if an I/O error has occured
+ */
+ Manifest(InputStream is, String jarFilename) throws IOException {
+ read(is);
+ this.jarFilename = jarFilename;
+ }
+
+ /**
* Constructs a new Manifest that is a copy of the specified Manifest.
*
* @param man the Manifest to copy
*/
public Manifest(Manifest man) {
+ this();
attr.putAll(man.getMainAttributes());
entries.putAll(man.getEntries());
}
@@ -179,6 +202,14 @@
return;
}
+ static String getErrorPosition(String filename, final int lineNumber) {
+ if (filename == null || !jarInfoInExceptionText) {
+ return "line " + lineNumber;
+ }
+
+ return "manifest of " + filename + ":" + lineNumber;
+ }
+
/**
* Reads the Manifest from the specified InputStream. The entry
* names and attributes read will be merged in with the current
@@ -193,7 +224,7 @@
// Line buffer
byte[] lbuf = new byte[512];
// Read the main attributes for the manifest
- attr.read(fis, lbuf);
+ int lineNumber = attr.read(fis, lbuf, jarFilename, 0);
// Total number of entries, attributes read
int ecount = 0, acount = 0;
// Average size of entry attributes
@@ -206,8 +237,11 @@
while ((len = fis.readLine(lbuf)) != -1) {
byte c = lbuf[--len];
+ lineNumber++;
+
if (c != '\n' && c != '\r') {
- throw new IOException("manifest line too long");
+ throw new IOException("manifest line too long ("
+ + getErrorPosition(jarFilename, lineNumber) + ")");
}
if (len > 0 && lbuf[len-1] == '\r') {
--len;
@@ -220,7 +254,8 @@
if (name == null) {
name = parseName(lbuf, len);
if (name == null) {
- throw new IOException("invalid manifest format");
+ throw new IOException("invalid manifest format"
+ + getErrorPosition(jarFilename, lineNumber) + ")");
}
if (fis.peek() == ' ') {
// name is wrapped
@@ -246,7 +281,7 @@
attr = new Attributes(asize);
entries.put(name, attr);
}
- attr.read(fis, lbuf);
+ lineNumber = attr.read(fis, lbuf, jarFilename, lineNumber);
ecount++;
acount += attr.size();
//XXX: Fix for when the average is 0. When it is 0,
--- a/src/java.base/share/classes/java/util/stream/Collectors.java Wed Sep 26 18:36:55 2018 +0100
+++ b/src/java.base/share/classes/java/util/stream/Collectors.java Thu Sep 27 10:49:10 2018 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012, 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -1885,6 +1885,102 @@
}
/**
+ * Returns a {@code Collector} that is a composite of two downstream collectors.
+ * Every element passed to the resulting collector is processed by both downstream
+ * collectors, then their results are merged using the specified merge function
+ * into the final result.
+ *
+ * <p>The resulting collector functions do the following:
+ *
+ * <ul>
+ * <li>supplier: creates a result container that contains result containers
+ * obtained by calling each collector's supplier
+ * <li>accumulator: calls each collector's accumulator with its result container
+ * and the input element
+ * <li>combiner: calls each collector's combiner with two result containers
+ * <li>finisher: calls each collector's finisher with its result container,
+ * then calls the supplied merger and returns its result.
+ * </ul>
+ *
+ * <p>The resulting collector is {@link Collector.Characteristics#UNORDERED} if both downstream
+ * collectors are unordered and {@link Collector.Characteristics#CONCURRENT} if both downstream
+ * collectors are concurrent.
+ *
+ * @param <T> the type of the input elements
+ * @param <R1> the result type of the first collector
+ * @param <R2> the result type of the second collector
+ * @param <R> the final result type
+ * @param downstream1 the first downstream collector
+ * @param downstream2 the second downstream collector
+ * @param merger the function which merges two results into the single one
+ * @return a {@code Collector} which aggregates the results of two supplied collectors.
+ * @since 12
+ */
+ public static <T, R1, R2, R>
+ Collector<T, ?, R> teeing(Collector<? super T, ?, R1> downstream1,
+ Collector<? super T, ?, R2> downstream2,
+ BiFunction<? super R1, ? super R2, R> merger) {
+ return teeing0(downstream1, downstream2, merger);
+ }
+
+ private static <T, A1, A2, R1, R2, R>
+ Collector<T, ?, R> teeing0(Collector<? super T, A1, R1> downstream1,
+ Collector<? super T, A2, R2> downstream2,
+ BiFunction<? super R1, ? super R2, R> merger) {
+ Objects.requireNonNull(downstream1, "downstream1");
+ Objects.requireNonNull(downstream2, "downstream2");
+ Objects.requireNonNull(merger, "merger");
+
+ Supplier<A1> c1Supplier = Objects.requireNonNull(downstream1.supplier(), "downstream1 supplier");
+ Supplier<A2> c2Supplier = Objects.requireNonNull(downstream2.supplier(), "downstream2 supplier");
+ BiConsumer<A1, ? super T> c1Accumulator =
+ Objects.requireNonNull(downstream1.accumulator(), "downstream1 accumulator");
+ BiConsumer<A2, ? super T> c2Accumulator =
+ Objects.requireNonNull(downstream2.accumulator(), "downstream2 accumulator");
+ BinaryOperator<A1> c1Combiner = Objects.requireNonNull(downstream1.combiner(), "downstream1 combiner");
+ BinaryOperator<A2> c2Combiner = Objects.requireNonNull(downstream2.combiner(), "downstream2 combiner");
+ Function<A1, R1> c1Finisher = Objects.requireNonNull(downstream1.finisher(), "downstream1 finisher");
+ Function<A2, R2> c2Finisher = Objects.requireNonNull(downstream2.finisher(), "downstream2 finisher");
+
+ Set<Collector.Characteristics> characteristics;
+ Set<Collector.Characteristics> c1Characteristics = downstream1.characteristics();
+ Set<Collector.Characteristics> c2Characteristics = downstream2.characteristics();
+ if (CH_ID.containsAll(c1Characteristics) || CH_ID.containsAll(c2Characteristics)) {
+ characteristics = CH_NOID;
+ } else {
+ EnumSet<Collector.Characteristics> c = EnumSet.noneOf(Collector.Characteristics.class);
+ c.addAll(c1Characteristics);
+ c.retainAll(c2Characteristics);
+ c.remove(Collector.Characteristics.IDENTITY_FINISH);
+ characteristics = Collections.unmodifiableSet(c);
+ }
+
+ class PairBox {
+ A1 left = c1Supplier.get();
+ A2 right = c2Supplier.get();
+
+ void add(T t) {
+ c1Accumulator.accept(left, t);
+ c2Accumulator.accept(right, t);
+ }
+
+ PairBox combine(PairBox other) {
+ left = c1Combiner.apply(left, other.left);
+ right = c2Combiner.apply(right, other.right);
+ return this;
+ }
+
+ R get() {
+ R1 r1 = c1Finisher.apply(left);
+ R2 r2 = c2Finisher.apply(right);
+ return merger.apply(r1, r2);
+ }
+ }
+
+ return new CollectorImpl<>(PairBox::new, PairBox::add, PairBox::combine, PairBox::get, characteristics);
+ }
+
+ /**
* Implementation class used by partitioningBy.
*/
private static final class Partition<T>
--- a/src/java.base/share/classes/sun/net/util/SocketExceptions.java Wed Sep 26 18:36:55 2018 +0100
+++ b/src/java.base/share/classes/sun/net/util/SocketExceptions.java Thu Sep 27 10:49:10 2018 -0700
@@ -30,43 +30,14 @@
import java.net.InetSocketAddress;
import java.security.AccessController;
import java.security.PrivilegedAction;
-import java.security.Security;
+
+import sun.security.util.SecurityProperties;
public final class SocketExceptions {
private SocketExceptions() {}
- /**
- * Security or system property which specifies categories of
- * (potentially sensitive) information that may be included
- * in exception text. This class only defines one category:
- * "hostInfo" which represents the hostname and port number
- * of the remote peer relating to a socket exception.
- * The property value is a comma separated list of
- * case insignificant category names.
- */
- private static final String enhancedTextPropname = "jdk.includeInExceptions";
-
- private static final boolean enhancedExceptionText = initTextProp();
-
- private static boolean initTextProp() {
- return AccessController.doPrivileged(new PrivilegedAction<Boolean>() {
- public Boolean run() {
- String val = System.getProperty(enhancedTextPropname);
- if (val == null) {
- val = Security.getProperty(enhancedTextPropname);
- if (val == null)
- return false;
- }
- String[] tokens = val.split(",");
- for (String token : tokens) {
- if (token.equalsIgnoreCase("hostinfo"))
- return true;
- }
- return false;
- }
- });
- }
-
+ private static final boolean enhancedExceptionText =
+ SecurityProperties.includedInExceptions("hostInfo");
/**
* Utility which takes an exception and returns either the same exception
@@ -74,8 +45,9 @@
* and detail message enhanced with addressing information from the
* given InetSocketAddress.
*
- * If the system/security property "jdk.net.enhanceExceptionText" is not
- * set or is false, then the original exception is returned.
+ * If the system/security property "jdk.includeInExceptions" is not
+ * set or does not contain the category hostInfo,
+ * then the original exception is returned.
*
* Only specific IOException subtypes are supported.
*/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/java.base/share/classes/sun/security/util/SecurityProperties.java Thu Sep 27 10:49:10 2018 -0700
@@ -0,0 +1,77 @@
+/*
+ * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2018 SAP SE. 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.
+ */
+
+package sun.security.util;
+
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+import java.security.Security;
+
+public class SecurityProperties {
+
+ /**
+ * Returns the value of the security property propName, which can be overridden
+ * by a system property of the same name
+ *
+ * @param propName the name of the system or security property
+ * @return the value of the system or security property
+ */
+ public static String privilegedGetOverridable(String propName) {
+ return AccessController.doPrivileged((PrivilegedAction<String>)
+ () -> {
+ String val = System.getProperty(propName);
+ if (val == null) {
+ return Security.getProperty(propName);
+ } else {
+ return val;
+ }
+ });
+ }
+
+ /**
+ * Returns true in case the system or security property "jdk.includeInExceptions"
+ * contains the category refName
+ *
+ * @param refName the category to check
+ * @return true in case the system or security property "jdk.includeInExceptions"
+ * contains refName, false otherwise
+ */
+ public static boolean includedInExceptions(String refName) {
+ String val = privilegedGetOverridable("jdk.includeInExceptions");
+ if (val == null) {
+ return false;
+ }
+
+ String[] tokens = val.split(",");
+ for (String token : tokens) {
+ token = token.trim();
+ if (token.equalsIgnoreCase(refName)) {
+ return true;
+ }
+ }
+ return false;
+ }
+}
--- a/src/java.base/share/conf/security/java.security Wed Sep 26 18:36:55 2018 +0100
+++ b/src/java.base/share/conf/security/java.security Thu Sep 27 10:49:10 2018 -0700
@@ -1081,7 +1081,10 @@
# java.nio.channels package will contain enhanced exception
# message information
#
+# jar - enables more detailed information in the IOExceptions thrown
+# by classes in the java.util.jar package
+#
# The property setting in this file can be overridden by a system property of
# the same name, with the same syntax and possible values.
#
-#jdk.includeInExceptions=hostInfo
+#jdk.includeInExceptions=hostInfo,jar
--- a/src/java.base/unix/native/libnet/net_util_md.h Wed Sep 26 18:36:55 2018 +0100
+++ b/src/java.base/unix/native/libnet/net_util_md.h Thu Sep 27 10:49:10 2018 -0700
@@ -47,7 +47,7 @@
#ifndef SO_REUSEPORT
#ifdef __linux__
#define SO_REUSEPORT 15
-#elif __solaris__
+#elif defined(__solaris__)
#define SO_REUSEPORT 0x100e
#elif defined(AIX) || defined(MACOSX)
#define SO_REUSEPORT 0x0200
--- a/src/java.base/unix/native/libnio/ch/NativeThread.c Wed Sep 26 18:36:55 2018 +0100
+++ b/src/java.base/unix/native/libnio/ch/NativeThread.c Thu Sep 27 10:49:10 2018 -0700
@@ -37,14 +37,14 @@
#include <pthread.h>
/* Also defined in net/linux_close.c */
#define INTERRUPT_SIGNAL (__SIGRTMAX - 2)
-#elif _AIX
+#elif defined(_AIX)
#include <pthread.h>
/* Also defined in net/aix_close.c */
#define INTERRUPT_SIGNAL (SIGRTMAX - 1)
-#elif __solaris__
+#elif defined(__solaris__)
#include <thread.h>
#define INTERRUPT_SIGNAL (SIGRTMAX - 2)
-#elif _ALLBSD_SOURCE
+#elif defined(_ALLBSD_SOURCE)
#include <pthread.h>
/* Also defined in net/bsd_close.c */
#define INTERRUPT_SIGNAL SIGIO
--- a/src/java.base/unix/native/libnio/ch/nio_util.h Wed Sep 26 18:36:55 2018 +0100
+++ b/src/java.base/unix/native/libnio/ch/nio_util.h Thu Sep 27 10:49:10 2018 -0700
@@ -40,7 +40,7 @@
#ifndef SO_REUSEPORT
#ifdef __linux__
#define SO_REUSEPORT 15
-#elif __solaris__
+#elif defined(__solaris__)
#define SO_REUSEPORT 0x100e
#elif defined(AIX) || defined(MACOSX)
#define SO_REUSEPORT 0x0200
--- a/src/java.desktop/macosx/native/libosxapp/AWT_debug.h Wed Sep 26 18:36:55 2018 +0100
+++ b/src/java.desktop/macosx/native/libosxapp/AWT_debug.h Thu Sep 27 10:49:10 2018 -0700
@@ -26,9 +26,11 @@
#ifndef macosx_port_awt_debug_h
#define macosx_port_awt_debug_h
+#include "jni.h"
+
#import <Cocoa/Cocoa.h>
-bool ShouldPrintVerboseDebugging();
+JNIEXPORT bool ShouldPrintVerboseDebugging();
#define kInternalError "java/lang/InternalError"
--- a/src/java.desktop/macosx/native/libosxapp/NSApplicationAWT.h Wed Sep 26 18:36:55 2018 +0100
+++ b/src/java.desktop/macosx/native/libosxapp/NSApplicationAWT.h Thu Sep 27 10:49:10 2018 -0700
@@ -32,7 +32,7 @@
#import <Cocoa/Cocoa.h>
#import <JavaNativeFoundation/JavaNativeFoundation.h>
-@interface NSApplicationAWT : NSApplication <NSUserNotificationCenterDelegate> {
+JNIEXPORT @interface NSApplicationAWT : NSApplication <NSUserNotificationCenterDelegate> {
NSString *fApplicationName;
NSWindow *eventTransparentWindow;
NSTimeInterval dummyEventTimestamp;
@@ -57,5 +57,5 @@
@end
-void OSXAPP_SetApplicationDelegate(id <NSApplicationDelegate> delegate);
+JNIEXPORT void OSXAPP_SetApplicationDelegate(id <NSApplicationDelegate> delegate);
--- a/src/java.desktop/macosx/native/libosxapp/PropertiesUtilities.h Wed Sep 26 18:36:55 2018 +0100
+++ b/src/java.desktop/macosx/native/libosxapp/PropertiesUtilities.h Thu Sep 27 10:49:10 2018 -0700
@@ -23,11 +23,17 @@
* questions.
*/
+/*
+ * Must include this before JavaNativeFoundation.h to get jni.h from build
+ */
+#include "jni.h"
+#include "jni_util.h"
+
#import <Cocoa/Cocoa.h>
#import <JavaNativeFoundation/JavaNativeFoundation.h>
-@interface PropertiesUtilities : NSObject
+JNIEXPORT @interface PropertiesUtilities : NSObject
+ (NSString *) javaSystemPropertyForKey:(NSString *)key withEnv:(JNIEnv *)env;
--- a/src/java.desktop/macosx/native/libosxapp/ThreadUtilities.h Wed Sep 26 18:36:55 2018 +0100
+++ b/src/java.desktop/macosx/native/libosxapp/ThreadUtilities.h Thu Sep 27 10:49:10 2018 -0700
@@ -26,6 +26,8 @@
#ifndef __THREADUTILITIES_H
#define __THREADUTILITIES_H
+#include "jni.h"
+
#import <pthread.h>
#import "AWT_debug.h"
@@ -135,6 +137,6 @@
+ (void)performOnMainThread:(SEL)aSelector on:(id)target withObject:(id)arg waitUntilDone:(BOOL)wait;
@end
-void OSXAPP_SetJavaVM(JavaVM *vm);
+JNIEXPORT void OSXAPP_SetJavaVM(JavaVM *vm);
#endif /* __THREADUTILITIES_H */
--- a/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Flags.java Wed Sep 26 18:36:55 2018 +0100
+++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Flags.java Thu Sep 27 10:49:10 2018 -0700
@@ -433,7 +433,9 @@
SYSTEM_MODULE(Flags.SYSTEM_MODULE),
DEPRECATED_ANNOTATION(Flags.DEPRECATED_ANNOTATION),
DEPRECATED_REMOVAL(Flags.DEPRECATED_REMOVAL),
- HAS_RESOURCE(Flags.HAS_RESOURCE);
+ HAS_RESOURCE(Flags.HAS_RESOURCE),
+ POTENTIALLY_AMBIGUOUS(Flags.POTENTIALLY_AMBIGUOUS),
+ ANONCONSTR_BASED(Flags.ANONCONSTR_BASED);
Flag(long flag) {
this.value = flag;
--- a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Analyzer.java Wed Sep 26 18:36:55 2018 +0100
+++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Analyzer.java Thu Sep 27 10:49:10 2018 -0700
@@ -166,10 +166,10 @@
res = EnumSet.allOf(AnalyzerMode.class);
}
for (AnalyzerMode mode : values()) {
- if (modes.contains(mode.opt)) {
+ if (modes.contains("-" + mode.opt) || !mode.feature.allowedInSource(source)) {
+ res.remove(mode);
+ } else if (modes.contains(mode.opt)) {
res.add(mode);
- } else if (modes.contains("-" + mode.opt) || !mode.feature.allowedInSource(source)) {
- res.remove(mode);
}
}
return res;
--- a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java Wed Sep 26 18:36:55 2018 +0100
+++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java Thu Sep 27 10:49:10 2018 -0700
@@ -2689,12 +2689,14 @@
*/
@Override
public void visitLambda(final JCLambda that) {
+ boolean wrongContext = false;
if (pt().isErroneous() || (pt().hasTag(NONE) && pt() != Type.recoveryType)) {
if (pt().hasTag(NONE) && (env.info.enclVar == null || !env.info.enclVar.type.isErroneous())) {
//lambda only allowed in assignment or method invocation/cast context
log.error(that.pos(), Errors.UnexpectedLambda);
}
resultInfo = recoveryInfo;
+ wrongContext = true;
}
//create an environment for attribution of the lambda expression
final Env<AttrContext> localEnv = lambdaEnv(that, env);
@@ -2811,7 +2813,8 @@
checkAccessibleTypes(that, localEnv, resultInfo.checkContext.inferenceContext(), lambdaType, currentTarget);
}
- result = check(that, currentTarget, KindSelector.VAL, resultInfo);
+ result = wrongContext ? that.type = types.createErrorType(pt())
+ : check(that, currentTarget, KindSelector.VAL, resultInfo);
} catch (Types.FunctionDescriptorLookupError ex) {
JCDiagnostic cause = ex.getDiagnostic();
resultInfo.checkContext.report(that, cause);
@@ -5343,23 +5346,12 @@
}
@Override
- public void visitLambda(JCLambda that) {
- super.visitLambda(that);
- if (that.target == null) {
- that.target = syms.unknownType;
- }
- }
-
- @Override
public void visitReference(JCMemberReference that) {
super.visitReference(that);
if (that.sym == null) {
that.sym = new MethodSymbol(0, names.empty, dummyMethodType(),
syms.noSymbol);
}
- if (that.target == null) {
- that.target = syms.unknownType;
- }
}
}
// </editor-fold>
--- a/src/jdk.compiler/share/classes/com/sun/tools/javac/launcher/Main.java Wed Sep 26 18:36:55 2018 +0100
+++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/launcher/Main.java Thu Sep 27 10:49:10 2018 -0700
@@ -50,8 +50,9 @@
import java.nio.file.InvalidPathException;
import java.nio.file.Path;
import java.nio.file.Paths;
-import java.security.AccessController;
-import java.security.PrivilegedAction;
+import java.security.CodeSigner;
+import java.security.CodeSource;
+import java.security.ProtectionDomain;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Arrays;
@@ -63,6 +64,8 @@
import java.util.MissingResourceException;
import java.util.NoSuchElementException;
import java.util.ResourceBundle;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
import javax.lang.model.SourceVersion;
import javax.lang.model.element.NestingKind;
@@ -182,7 +185,7 @@
public void run(String[] runtimeArgs, String[] args) throws Fault, InvocationTargetException {
Path file = getFile(args);
- Context context = new Context();
+ Context context = new Context(file.toAbsolutePath());
String mainClassName = compile(file, getJavacOpts(runtimeArgs), context);
String[] appArgs = Arrays.copyOfRange(args, 1, args.length);
@@ -193,7 +196,7 @@
* Returns the path for the filename found in the first of an array of arguments.
*
* @param args the array
- * @return the path
+ * @return the path, as given in the array of args
* @throws Fault if there is a problem determining the path, or if the file does not exist
*/
private Path getFile(String[] args) throws Fault {
@@ -396,12 +399,10 @@
*/
private void execute(String mainClassName, String[] appArgs, Context context)
throws Fault, InvocationTargetException {
+ System.setProperty("jdk.launcher.sourcefile", context.file.toString());
ClassLoader cl = context.getClassLoader(ClassLoader.getSystemClassLoader());
try {
Class<?> appClass = Class.forName(mainClassName, true, cl);
- if (appClass.getClassLoader() != cl) {
- throw new Fault(Errors.UnexpectedClass(mainClassName));
- }
Method main = appClass.getDeclaredMethod("main", String[].class);
int PUBLIC_STATIC = Modifier.PUBLIC | Modifier.STATIC;
if ((main.getModifiers() & PUBLIC_STATIC) != PUBLIC_STATIC) {
@@ -481,14 +482,19 @@
* a class loader.
*/
private static class Context {
- private Map<String, byte[]> inMemoryClasses = new HashMap<>();
+ private final Path file;
+ private final Map<String, byte[]> inMemoryClasses = new HashMap<>();
+
+ Context(Path file) {
+ this.file = file;
+ }
JavaFileManager getFileManager(StandardJavaFileManager delegate) {
return new MemoryFileManager(inMemoryClasses, delegate);
}
ClassLoader getClassLoader(ClassLoader parent) {
- return new MemoryClassLoader(inMemoryClasses, parent);
+ return new MemoryClassLoader(inMemoryClasses, parent, file);
}
}
@@ -535,36 +541,126 @@
}
/**
- * An in-memory classloader, that uses an in-memory cache written by {@link MemoryFileManager}.
+ * An in-memory classloader, that uses an in-memory cache of classes written by
+ * {@link MemoryFileManager}.
*
- * <p>The classloader uses the standard parent-delegation model, just providing
- * {@code findClass} to find classes in the in-memory cache.
+ * <p>The classloader inverts the standard parent-delegation model, giving preference
+ * to classes defined in the source file before classes known to the parent (such
+ * as any like-named classes that might be found on the application class path.)
*/
private static class MemoryClassLoader extends ClassLoader {
/**
- * The map of classes known to this class loader, indexed by
+ * The map of all classes found in the source file, indexed by
* {@link ClassLoader#name binary name}.
*/
- private final Map<String, byte[]> map;
+ private final Map<String, byte[]> sourceFileClasses;
+
+ /**
+ * A minimal protection domain, specifying a code source of the source file itself,
+ * used for classes found in the source file and defined by this loader.
+ */
+ private final ProtectionDomain domain;
+
+ MemoryClassLoader(Map<String, byte[]> sourceFileClasses, ClassLoader parent, Path file) {
+ super(parent);
+ this.sourceFileClasses = sourceFileClasses;
+ CodeSource codeSource;
+ try {
+ codeSource = new CodeSource(file.toUri().toURL(), (CodeSigner[]) null);
+ } catch (MalformedURLException e) {
+ codeSource = null;
+ }
+ domain = new ProtectionDomain(codeSource, null, this, null);
+ }
- MemoryClassLoader(Map<String, byte[]> map, ClassLoader parent) {
- super(parent);
- this.map = map;
+ /**
+ * Override loadClass to check for classes defined in the source file
+ * before checking for classes in the parent class loader,
+ * including those on the classpath.
+ *
+ * {@code loadClass(String name)} calls this method, and so will have the same behavior.
+ *
+ * @param name the name of the class to load
+ * @param resolve whether or not to resolve the class
+ * @return the class
+ * @throws ClassNotFoundException if the class is not found
+ */
+ @Override
+ protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {
+ synchronized (getClassLoadingLock(name)) {
+ Class<?> c = findLoadedClass(name);
+ if (c == null) {
+ if (sourceFileClasses.containsKey(name)) {
+ c = findClass(name);
+ } else {
+ c = getParent().loadClass(name);
+ }
+ if (resolve) {
+ resolveClass(c);
+ }
+ }
+ return c;
+ }
+ }
+
+
+ /**
+ * Override getResource to check for resources (i.e. class files) defined in the
+ * source file before checking resources in the parent class loader,
+ * including those on the class path.
+ *
+ * {@code getResourceAsStream(String name)} calls this method,
+ * and so will have the same behavior.
+ *
+ * @param name the name of the resource
+ * @return a URL for the resource, or null if not found
+ */
+ @Override
+ public URL getResource(String name) {
+ if (sourceFileClasses.containsKey(toBinaryName(name))) {
+ return findResource(name);
+ } else {
+ return getParent().getResource(name);
+ }
+ }
+
+ /**
+ * Override getResources to check for resources (i.e. class files) defined in the
+ * source file before checking resources in the parent class loader,
+ * including those on the class path.
+ *
+ * @param name the name of the resource
+ * @return an enumeration of the resources in this loader and in the application class loader
+ */
+ @Override
+ public Enumeration<URL> getResources(String name) throws IOException {
+ URL u = findResource(name);
+ Enumeration<URL> e = getParent().getResources(name);
+ if (u == null) {
+ return e;
+ } else {
+ List<URL> list = new ArrayList<>();
+ list.add(u);
+ while (e.hasMoreElements()) {
+ list.add(e.nextElement());
+ }
+ return Collections.enumeration(list);
+ }
}
@Override
protected Class<?> findClass(String name) throws ClassNotFoundException {
- byte[] bytes = map.get(name);
+ byte[] bytes = sourceFileClasses.get(name);
if (bytes == null) {
throw new ClassNotFoundException(name);
}
- return defineClass(name, bytes, 0, bytes.length);
+ return defineClass(name, bytes, 0, bytes.length, domain);
}
@Override
public URL findResource(String name) {
String binaryName = toBinaryName(name);
- if (binaryName == null || map.get(binaryName) == null) {
+ if (binaryName == null || sourceFileClasses.get(binaryName) == null) {
return null;
}
@@ -628,7 +724,7 @@
if (!u.getProtocol().equalsIgnoreCase(PROTOCOL)) {
throw new IllegalArgumentException(u.toString());
}
- return new MemoryURLConnection(u, map.get(toBinaryName(u.getPath())));
+ return new MemoryURLConnection(u, sourceFileClasses.get(toBinaryName(u.getPath())));
}
}
--- a/src/jdk.compiler/share/classes/com/sun/tools/javac/main/Option.java Wed Sep 26 18:36:55 2018 +0100
+++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/main/Option.java Thu Sep 27 10:49:10 2018 -0700
@@ -328,7 +328,7 @@
ENCODING("-encoding", "opt.arg.encoding", "opt.encoding", STANDARD, FILEMANAGER),
- SOURCE("-source", "opt.arg.release", "opt.source", STANDARD, BASIC) {
+ SOURCE("--source -source", "opt.arg.release", "opt.source", STANDARD, BASIC) {
@Override
public void process(OptionHelper helper, String option, String operand) throws InvalidValueException {
Source source = Source.lookup(operand);
@@ -349,7 +349,7 @@
}
},
- TARGET("-target", "opt.arg.release", "opt.target", STANDARD, BASIC) {
+ TARGET("--target -target", "opt.arg.release", "opt.target", STANDARD, BASIC) {
@Override
public void process(OptionHelper helper, String option, String operand) throws InvalidValueException {
Target target = Target.lookup(operand);
--- a/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/launcher.properties Wed Sep 26 18:36:55 2018 +0100
+++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/launcher.properties Thu Sep 27 10:49:10 2018 -0700
@@ -109,10 +109,6 @@
can''t find class: {0}
# 0: string
-launcher.err.unexpected.class=\
- class found on application class path: {0}
-
-# 0: string
launcher.err.cant.find.main.method=\
can''t find main(String[]) method in class: {0}
--- a/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/Start.java Wed Sep 26 18:36:55 2018 +0100
+++ b/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/Start.java Thu Sep 27 10:49:10 2018 -0700
@@ -380,8 +380,8 @@
String platformString = compOpts.get("--release");
if (platformString != null) {
- if (compOpts.isSet("-source")) {
- usageError("main.release.bootclasspath.conflict", "-source");
+ if (compOpts.isSet(Option.SOURCE.primaryName)) {
+ usageError("main.release.bootclasspath.conflict", Option.SOURCE.primaryName);
}
if (fileManagerOpts.containsKey(Option.BOOT_CLASS_PATH)) {
usageError("main.release.bootclasspath.conflict", Option.BOOT_CLASS_PATH.getPrimaryName());
--- a/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/ToolOption.java Wed Sep 26 18:36:55 2018 +0100
+++ b/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/ToolOption.java Thu Sep 27 10:49:10 2018 -0700
@@ -174,6 +174,13 @@
SOURCE("-source", true) {
@Override
public void process(Helper helper, String arg) {
+ helper.setCompilerOpt("--source", arg);
+ }
+ },
+
+ SOURCE2("--source", true) {
+ @Override
+ public void process(Helper helper, String arg) {
helper.setCompilerOpt(opt, arg);
}
},
--- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlConfiguration.java Wed Sep 26 18:36:55 2018 +0100
+++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlConfiguration.java Thu Sep 27 10:49:10 2018 -0700
@@ -209,12 +209,6 @@
public HtmlVersion htmlVersion = null;
/**
- * Flag to enable/disable use of module directories when generating docs for modules
- * Default: on (module directories are enabled).
- */
- public boolean useModuleDirectories = true;
-
- /**
* Collected set of doclint options
*/
public Map<Doclet.Option, String> doclintOpts = new LinkedHashMap<>();
@@ -840,13 +834,6 @@
}
return true;
}
- },
- new XOption(resources, "--no-module-directories") {
- @Override
- public boolean process(String option, List<String> args) {
- useModuleDirectories = false;
- return true;
- }
}
};
Set<Doclet.Option> oset = new TreeSet<>();
--- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDocletWriter.java Wed Sep 26 18:36:55 2018 +0100
+++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDocletWriter.java Thu Sep 27 10:49:10 2018 -0700
@@ -355,6 +355,7 @@
/**
* Returns a TagletWriter that knows how to write HTML.
*
+ * @param isFirstSentence true if we want to write the first sentence
* @return a TagletWriter that knows how to write HTML.
*/
public TagletWriter getTagletWriterInstance(boolean isFirstSentence) {
@@ -362,6 +363,17 @@
}
/**
+ * Returns a TagletWriter that knows how to write HTML.
+ *
+ * @param isFirstSentence true if we want to write the first sentence
+ * @param inSummary true if tags are to be added in a summary section
+ * @return a TagletWriter
+ */
+ public TagletWriter getTagletWriterInstance(boolean isFirstSentence, boolean inSummary) {
+ return new TagletWriterImpl(this, isFirstSentence, inSummary);
+ }
+
+ /**
* Get Package link, with target frame.
*
* @param pkg The link will be to the "package-summary.html" page for this package
@@ -610,7 +622,7 @@
return links.createLink(pathString(packageElement, DocPaths.PACKAGE_SUMMARY),
label);
} else {
- DocLink crossPkgLink = getCrossPackageLink(utils.getPackageName(packageElement));
+ DocLink crossPkgLink = getCrossPackageLink(packageElement);
if (crossPkgLink != null) {
return links.createLink(crossPkgLink, label);
} else {
@@ -693,11 +705,10 @@
/*************************************************************
* Return a class cross link to external class documentation.
- * The name must be fully qualified to determine which package
- * the class is in. The -link option does not allow users to
+ * The -link option does not allow users to
* link to external classes in the "default" package.
*
- * @param qualifiedClassName the qualified name of the external class.
+ * @param classElement the class element
* @param refMemName the name of the member being referenced. This should
* be null or empty string if no member is being referenced.
* @param label the label for the external link.
@@ -705,19 +716,15 @@
* @param code true if the label should be code font.
* @return the link
*/
- public Content getCrossClassLink(String qualifiedClassName, String refMemName,
+ public Content getCrossClassLink(TypeElement classElement, String refMemName,
Content label, boolean strong, boolean code) {
- String className = "";
- String packageName = qualifiedClassName == null ? "" : qualifiedClassName;
- int periodIndex;
- while ((periodIndex = packageName.lastIndexOf('.')) != -1) {
- className = packageName.substring(periodIndex + 1, packageName.length()) +
- (className.length() > 0 ? "." + className : "");
+ if (classElement != null) {
+ String className = utils.getSimpleName(classElement);
+ PackageElement packageElement = utils.containingPackage(classElement);
Content defaultLabel = new StringContent(className);
if (code)
defaultLabel = HtmlTree.CODE(defaultLabel);
- packageName = packageName.substring(0, periodIndex);
- if (getCrossPackageLink(packageName) != null) {
+ if (getCrossPackageLink(packageElement) != null) {
/*
The package exists in external documentation, so link to the external
class (assuming that it exists). This is definitely a limitation of
@@ -725,13 +732,13 @@
exists, but no way to determine if the external class exists. We just
have to assume that it does.
*/
- DocLink link = configuration.extern.getExternalLink(packageName, pathToRoot,
+ DocLink link = configuration.extern.getExternalLink(packageElement, pathToRoot,
className + ".html", refMemName);
return links.createLink(link,
(label == null) || label.isEmpty() ? defaultLabel : label,
strong,
- resources.getText("doclet.Href_Class_Or_Interface_Title", packageName),
- "", true);
+ resources.getText("doclet.Href_Class_Or_Interface_Title",
+ utils.getPackageName(packageElement)), "", true);
}
}
return null;
@@ -744,14 +751,14 @@
return configuration.extern.isExternal(typeElement);
}
- public DocLink getCrossPackageLink(String pkgName) {
- return configuration.extern.getExternalLink(pkgName, pathToRoot,
+ public DocLink getCrossPackageLink(PackageElement element) {
+ return configuration.extern.getExternalLink(element, pathToRoot,
DocPaths.PACKAGE_SUMMARY.getPath());
}
- public DocLink getCrossModuleLink(String mdleName) {
- return configuration.extern.getExternalLink(mdleName, pathToRoot,
- docPaths.moduleSummary(mdleName).getPath());
+ public DocLink getCrossModuleLink(ModuleElement element) {
+ return configuration.extern.getExternalLink(element, pathToRoot,
+ docPaths.moduleSummary(utils.getModuleName(element)).getPath());
}
/**
@@ -1024,17 +1031,13 @@
return getPackageLink(refPackage, label);
} else {
// @see is not referencing an included class, module or package. Check for cross links.
- Content classCrossLink;
DocLink elementCrossLink = (configuration.extern.isModule(refClassName))
- ? getCrossModuleLink(refClassName) : getCrossPackageLink(refClassName);
+ ? getCrossModuleLink(utils.elementUtils.getModuleElement(refClassName)) :
+ (refPackage != null) ? getCrossPackageLink(refPackage) : null;
if (elementCrossLink != null) {
// Element cross link found
return links.createLink(elementCrossLink,
(label.isEmpty() ? text : label), true);
- } else if ((classCrossLink = getCrossClassLink(refClassName,
- refMemName, label, false, !isLinkPlain)) != null) {
- // Class cross link found (possibly to a member in the class)
- return classCrossLink;
} else {
// No cross link found so print warning
messages.warning(ch.getDocTreePath(see),
@@ -1136,7 +1139,7 @@
public void addInlineComment(Element element, DocTree tag, Content htmltree) {
CommentHelper ch = utils.getCommentHelper(element);
List<? extends DocTree> description = ch.getDescription(configuration, tag);
- addCommentTags(element, tag, description, false, false, htmltree);
+ addCommentTags(element, tag, description, false, false, false, htmltree);
}
/**
@@ -1160,7 +1163,7 @@
*/
public void addInlineDeprecatedComment(Element e, DocTree tag, Content htmltree) {
CommentHelper ch = utils.getCommentHelper(e);
- addCommentTags(e, ch.getBody(configuration, tag), true, false, htmltree);
+ addCommentTags(e, ch.getBody(configuration, tag), true, false, false, htmltree);
}
/**
@@ -1181,13 +1184,13 @@
* @param htmltree the documentation tree to which the summary will be added
*/
public void addSummaryComment(Element element, List<? extends DocTree> firstSentenceTags, Content htmltree) {
- addCommentTags(element, firstSentenceTags, false, true, htmltree);
+ addCommentTags(element, firstSentenceTags, false, true, true, htmltree);
}
public void addSummaryDeprecatedComment(Element element, DocTree tag, Content htmltree) {
CommentHelper ch = utils.getCommentHelper(element);
List<? extends DocTree> body = ch.getBody(configuration, tag);
- addCommentTags(element, ch.getFirstSentenceTrees(configuration, body), true, true, htmltree);
+ addCommentTags(element, ch.getFirstSentenceTrees(configuration, body), true, true, true, htmltree);
}
/**
@@ -1197,7 +1200,7 @@
* @param htmltree the documentation tree to which the inline comments will be added
*/
public void addInlineComment(Element element, Content htmltree) {
- addCommentTags(element, utils.getFullBody(element), false, false, htmltree);
+ addCommentTags(element, utils.getFullBody(element), false, false, false, htmltree);
}
/**
@@ -1207,11 +1210,12 @@
* @param tags the first sentence tags for the doc
* @param depr true if it is deprecated
* @param first true if the first sentence tags should be added
+ * @param inSummary true if the comment tags are added into the summary section
* @param htmltree the documentation tree to which the comment tags will be added
*/
private void addCommentTags(Element element, List<? extends DocTree> tags, boolean depr,
- boolean first, Content htmltree) {
- addCommentTags(element, null, tags, depr, first, htmltree);
+ boolean first, boolean inSummary, Content htmltree) {
+ addCommentTags(element, null, tags, depr, first, inSummary, htmltree);
}
/**
@@ -1222,15 +1226,16 @@
* @param tags the first sentence tags for the doc
* @param depr true if it is deprecated
* @param first true if the first sentence tags should be added
+ * @param inSummary true if the comment tags are added into the summary section
* @param htmltree the documentation tree to which the comment tags will be added
*/
private void addCommentTags(Element element, DocTree holderTag, List<? extends DocTree> tags, boolean depr,
- boolean first, Content htmltree) {
+ boolean first, boolean inSummary, Content htmltree) {
if(configuration.nocomment){
return;
}
Content div;
- Content result = commentTagsToContent(null, element, tags, first);
+ Content result = commentTagsToContent(null, element, tags, first, inSummary);
if (depr) {
div = HtmlTree.DIV(HtmlStyle.deprecationComment, result);
htmltree.addContent(div);
@@ -1276,10 +1281,10 @@
private boolean commentRemoved = false;
/**
- * Converts inline tags and text to text strings, expanding the
+ * Converts inline tags and text to Content, expanding the
* inline tags along the way. Called wherever text can contain
* an inline tag, such as in comments or in free-form text arguments
- * to non-inline tags.
+ * to block tags.
*
* @param holderTag specific tag where comment resides
* @param element specific element where comment resides
@@ -1290,6 +1295,25 @@
*/
public Content commentTagsToContent(DocTree holderTag, Element element,
List<? extends DocTree> tags, boolean isFirstSentence) {
+ return commentTagsToContent(holderTag, element, tags, isFirstSentence, false);
+ }
+
+ /**
+ * Converts inline tags and text to text strings, expanding the
+ * inline tags along the way. Called wherever text can contain
+ * an inline tag, such as in comments or in free-form text arguments
+ * to block tags.
+ *
+ * @param holderTag specific tag where comment resides
+ * @param element specific element where comment resides
+ * @param tags array of text tags and inline tags (often alternating)
+ present in the text of interest for this element
+ * @param isFirstSentence true if text is first sentence
+ * @param inSummary if the comment tags are added into the summary section
+ * @return a Content object
+ */
+ public Content commentTagsToContent(DocTree holderTag, Element element,
+ List<? extends DocTree> tags, boolean isFirstSentence, boolean inSummary) {
final Content result = new ContentBuilder() {
@Override
@@ -1454,7 +1478,7 @@
public Boolean visitIndex(IndexTree node, Content p) {
Content output = TagletWriter.getInlineTagOutput(element,
configuration.tagletManager, holderTag, tag,
- getTagletWriterInstance(isFirstSentence));
+ getTagletWriterInstance(isFirstSentence, inSummary));
if (output != null) {
result.addContent(output);
}
--- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/LinkFactoryImpl.java Wed Sep 26 18:36:55 2018 +0100
+++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/LinkFactoryImpl.java Thu Sep 27 10:49:10 2018 -0700
@@ -111,7 +111,7 @@
}
} else {
Content crossLink = m_writer.getCrossClassLink(
- typeElement.getQualifiedName().toString(), classLinkInfo.where,
+ typeElement, classLinkInfo.where,
label, classLinkInfo.isStrong, true);
if (crossLink != null) {
link.addContent(crossLink);
--- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ModuleWriterImpl.java Wed Sep 26 18:36:55 2018 +0100
+++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ModuleWriterImpl.java Thu Sep 27 10:49:10 2018 -0700
@@ -396,14 +396,14 @@
(utils.getBlockTags(mdle, DocTree.Kind.PROVIDES)).forEach((tree) -> {
TypeElement t = ch.getServiceType(configuration, tree);
if (t != null) {
- providesTrees.put(t, commentTagsToContent(tree, mdle, ch.getDescription(configuration, tree), false));
+ providesTrees.put(t, commentTagsToContent(tree, mdle, ch.getDescription(configuration, tree), false, true));
}
});
// Generate the map of all services listed using @uses, and the description.
(utils.getBlockTags(mdle, DocTree.Kind.USES)).forEach((tree) -> {
TypeElement t = ch.getServiceType(configuration, tree);
if (t != null) {
- usesTrees.put(t, commentTagsToContent(tree, mdle, ch.getDescription(configuration, tree), false));
+ usesTrees.put(t, commentTagsToContent(tree, mdle, ch.getDescription(configuration, tree), false, true));
}
});
}
--- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/TagletWriterImpl.java Wed Sep 26 18:36:55 2018 +0100
+++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/TagletWriterImpl.java Thu Sep 27 10:49:10 2018 -0700
@@ -71,12 +71,18 @@
private final HtmlDocletWriter htmlWriter;
private final HtmlConfiguration configuration;
private final Utils utils;
+ private final boolean inSummary;
public TagletWriterImpl(HtmlDocletWriter htmlWriter, boolean isFirstSentence) {
+ this(htmlWriter, isFirstSentence, false);
+ }
+
+ public TagletWriterImpl(HtmlDocletWriter htmlWriter, boolean isFirstSentence, boolean inSummary) {
super(isFirstSentence);
this.htmlWriter = htmlWriter;
configuration = htmlWriter.configuration;
this.utils = configuration.utils;
+ this.inSummary = inSummary;
}
/**
@@ -107,53 +113,58 @@
String desc = ch.getText(itt.getDescription());
String anchorName = htmlWriter.links.getName(tagText);
- Content result = HtmlTree.A_ID(HtmlStyle.searchTagResult, anchorName, new StringContent(tagText));
- if (configuration.createindex && !tagText.isEmpty()) {
- SearchIndexItem si = new SearchIndexItem();
- si.setLabel(tagText);
- si.setDescription(desc);
- DocPaths docPaths = configuration.docPaths;
- new SimpleElementVisitor9<Void, Void>() {
- @Override
- public Void visitModule(ModuleElement e, Void p) {
- si.setUrl(docPaths.moduleSummary(e).getPath() + "#" + anchorName);
- si.setHolder(utils.getFullyQualifiedName(element));
- return null;
- }
+ Content result = null;
+ if (isFirstSentence && inSummary) {
+ result = new StringContent(tagText);
+ } else {
+ result = HtmlTree.A_ID(HtmlStyle.searchTagResult, anchorName, new StringContent(tagText));
+ if (configuration.createindex && !tagText.isEmpty()) {
+ SearchIndexItem si = new SearchIndexItem();
+ si.setLabel(tagText);
+ si.setDescription(desc);
+ DocPaths docPaths = configuration.docPaths;
+ new SimpleElementVisitor9<Void, Void>() {
+ @Override
+ public Void visitModule(ModuleElement e, Void p) {
+ si.setUrl(docPaths.moduleSummary(e).getPath() + "#" + anchorName);
+ si.setHolder(utils.getFullyQualifiedName(element));
+ return null;
+ }
- @Override
- public Void visitPackage(PackageElement e, Void p) {
- si.setUrl(docPaths.forPackage(e).getPath()
- + "/" + DocPaths.PACKAGE_SUMMARY.getPath() + "#" + anchorName);
- si.setHolder(utils.getSimpleName(element));
- return null;
- }
+ @Override
+ public Void visitPackage(PackageElement e, Void p) {
+ si.setUrl(docPaths.forPackage(e).getPath()
+ + "/" + DocPaths.PACKAGE_SUMMARY.getPath() + "#" + anchorName);
+ si.setHolder(utils.getSimpleName(element));
+ return null;
+ }
- @Override
- public Void visitType(TypeElement e, Void p) {
- si.setUrl(docPaths.forClass(e).getPath() + "#" + anchorName);
- si.setHolder(utils.getFullyQualifiedName(e));
- return null;
- }
+ @Override
+ public Void visitType(TypeElement e, Void p) {
+ si.setUrl(docPaths.forClass(e).getPath() + "#" + anchorName);
+ si.setHolder(utils.getFullyQualifiedName(e));
+ return null;
+ }
- @Override
- public Void visitVariable(VariableElement e, Void p) {
- TypeElement te = utils.getEnclosingTypeElement(e);
- si.setUrl(docPaths.forClass(te).getPath() + "#" + anchorName);
- si.setHolder(utils.getFullyQualifiedName(e) + "." + utils.getSimpleName(e));
- return null;
- }
+ @Override
+ public Void visitVariable(VariableElement e, Void p) {
+ TypeElement te = utils.getEnclosingTypeElement(e);
+ si.setUrl(docPaths.forClass(te).getPath() + "#" + anchorName);
+ si.setHolder(utils.getFullyQualifiedName(e) + "." + utils.getSimpleName(e));
+ return null;
+ }
- @Override
- protected Void defaultAction(Element e, Void p) {
- TypeElement te = utils.getEnclosingTypeElement(e);
- si.setUrl(docPaths.forClass(te).getPath() + "#" + anchorName);
- si.setHolder(utils.getFullyQualifiedName(e));
- return null;
- }
- }.visit(element);
- si.setCategory(configuration.getContent("doclet.SearchTags").toString());
- configuration.tagSearchIndex.add(si);
+ @Override
+ protected Void defaultAction(Element e, Void p) {
+ TypeElement te = utils.getEnclosingTypeElement(e);
+ si.setUrl(docPaths.forClass(te).getPath() + "#" + anchorName);
+ si.setHolder(utils.getFullyQualifiedName(e));
+ return null;
+ }
+ }.visit(element);
+ si.setCategory(configuration.getContent("doclet.SearchTags").toString());
+ configuration.tagSearchIndex.add(si);
+ }
}
return result;
}
@@ -236,7 +247,7 @@
body.addContent(HtmlTree.CODE(new RawHtml(paramName)));
body.addContent(" - ");
List<? extends DocTree> description = ch.getDescription(configuration, paramTag);
- body.addContent(htmlWriter.commentTagsToContent(paramTag, element, description, false));
+ body.addContent(htmlWriter.commentTagsToContent(paramTag, element, description, false, inSummary));
HtmlTree result = HtmlTree.DD(body);
return result;
}
@@ -264,7 +275,7 @@
result.addContent(HtmlTree.DT(HtmlTree.SPAN(HtmlStyle.returnLabel,
new StringContent(configuration.getText("doclet.Returns")))));
result.addContent(HtmlTree.DD(htmlWriter.commentTagsToContent(
- returnTag, element, ch.getDescription(configuration, returnTag), false)));
+ returnTag, element, ch.getDescription(configuration, returnTag), false, inSummary)));
return result;
}
@@ -333,7 +344,7 @@
body.addContent(", ");
}
List<? extends DocTree> bodyTags = ch.getBody(configuration, simpleTag);
- body.addContent(htmlWriter.commentTagsToContent(simpleTag, element, bodyTags, false));
+ body.addContent(htmlWriter.commentTagsToContent(simpleTag, element, bodyTags, false, inSummary));
many = true;
}
result.addContent(HtmlTree.DD(body));
@@ -348,7 +359,7 @@
result.addContent(HtmlTree.DT(HtmlTree.SPAN(HtmlStyle.simpleTagLabel, new RawHtml(header))));
CommentHelper ch = utils.getCommentHelper(element);
List<? extends DocTree> description = ch.getDescription(configuration, simpleTag);
- Content body = htmlWriter.commentTagsToContent(simpleTag, element, description, false);
+ Content body = htmlWriter.commentTagsToContent(simpleTag, element, description, false, inSummary);
result.addContent(HtmlTree.DD(body));
return result;
}
@@ -382,7 +393,7 @@
}
body.addContent(HtmlTree.CODE(excName));
List<? extends DocTree> description = ch.getDescription(configuration, throwsTag);
- Content desc = htmlWriter.commentTagsToContent(throwsTag, element, description, false);
+ Content desc = htmlWriter.commentTagsToContent(throwsTag, element, description, false, inSummary);
if (desc != null && !desc.isEmpty()) {
body.addContent(" - ");
body.addContent(desc);
@@ -429,7 +440,7 @@
public Content commentTagsToOutput(DocTree holderTag,
Element holder, List<? extends DocTree> tags, boolean isFirstSentence) {
return htmlWriter.commentTagsToContent(holderTag, holder,
- tags, isFirstSentence);
+ tags, isFirstSentence, inSummary);
}
/**
--- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/Navigation.java Wed Sep 26 18:36:55 2018 +0100
+++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/Navigation.java Thu Sep 27 10:49:10 2018 -0700
@@ -866,8 +866,7 @@
contents.packageLabel)));
} else {
DocLink crossPkgLink = configuration.extern.getExternalLink(
- configuration.utils.getPackageName(packageElement), pathToRoot,
- DocPaths.PACKAGE_SUMMARY.getPath());
+ packageElement, pathToRoot, DocPaths.PACKAGE_SUMMARY.getPath());
if (crossPkgLink != null) {
tree.addContent(HtmlTree.LI(links.createLink(crossPkgLink, contents.packageLabel)));
} else {
--- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/BaseConfiguration.java Wed Sep 26 18:36:55 2018 +0100
+++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/BaseConfiguration.java Thu Sep 27 10:49:10 2018 -0700
@@ -295,6 +295,11 @@
// A list of pairs containing urls and package list
private final List<Pair<String, String>> linkOfflineList = new ArrayList<>();
+ /**
+ * Flag to enable/disable use of module directories when generating docs for modules
+ * Default: on (module directories are enabled).
+ */
+ public boolean useModuleDirectories = true;
public boolean dumpOnError = false;
@@ -740,6 +745,13 @@
return true;
}
},
+ new XOption(resources, "--no-module-directories") {
+ @Override
+ public boolean process(String option, List<String> args) {
+ useModuleDirectories = false;
+ return true;
+ }
+ }
};
Set<Doclet.Option> set = new TreeSet<>();
set.addAll(Arrays.asList(options));
--- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/doclets.properties Wed Sep 26 18:36:55 2018 +0100
+++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/doclets.properties Thu Sep 27 10:49:10 2018 -0700
@@ -226,16 +226,15 @@
doclet.Description=Description
doclet.ConstantField=Constant Field
doclet.Value=Value
+doclet.linkMismatch_PackagedLinkedtoModule=The code being documented uses packages in the unnamed module, \
+ but the packages defined in {0} are in named modules.
+doclet.linkMismatch_ModuleLinkedtoPackage=The code being documented uses modules but the packages defined \
+ in {0} are in the unnamed module.
#Documentation for Enums
doclet.enum_values_doc.fullbody=\
Returns an array containing the constants of this enum type, in\n\
- the order they are declared. This method may be used to iterate\n\
- over the constants as follows:\n\
- <pre>\n\
- for ({0} c : {0}.values())\n\
- System.out.println(c);\n\
- </pre>
+ the order they are declared.
doclet.enum_values_doc.return=\
an array containing the constants of this enum type, in the order they are declared
--- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/Extern.java Wed Sep 26 18:36:55 2018 +0100
+++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/Extern.java Thu Sep 27 10:49:10 2018 -0700
@@ -29,8 +29,10 @@
import java.net.*;
import java.util.HashMap;
import java.util.Map;
+import java.util.TreeMap;
import javax.lang.model.element.Element;
+import javax.lang.model.element.ModuleElement;
import javax.lang.model.element.PackageElement;
import javax.tools.Diagnostic;
import javax.tools.DocumentationTool;
@@ -59,7 +61,8 @@
* Map element names onto Extern Item objects.
* Lazily initialized.
*/
- private Map<String, Item> elementToItemMap;
+ private Map<String, Item> moduleItems = new HashMap<>();
+ private Map<String, Map<String, Item>> packageItems = new HashMap<>();
/**
* The global configuration information for this run.
@@ -85,7 +88,7 @@
* The URL or the directory path at which the element documentation will be
* avaliable.
*/
- final String path;
+ final DocPath path;
/**
* If given path is directory path then true else if it is a URL then false.
@@ -93,11 +96,6 @@
final boolean relative;
/**
- * If the item is a module then true else if it is a package then false.
- */
- boolean isModule = false;
-
- /**
* Constructor to build a Extern Item object and map it with the element name.
* If the same element name is found in the map, then the first mapped
* Item object or offline location will be retained.
@@ -106,19 +104,11 @@
* @param path URL or Directory path from where the "element-list"
* file is picked.
* @param relative True if path is URL, false if directory path.
- * @param isModule True if the item is a module. False if it is a package.
*/
- Item(String elementName, String path, boolean relative, boolean isModule) {
+ Item(String elementName, DocPath path, boolean relative) {
this.elementName = elementName;
this.path = path;
this.relative = relative;
- this.isModule = isModule;
- if (elementToItemMap == null) {
- elementToItemMap = new HashMap<>();
- }
- if (!elementToItemMap.containsKey(elementName)) { // save the previous
- elementToItemMap.put(elementName, this); // mapped location
- }
}
/**
@@ -126,7 +116,7 @@
*/
@Override
public String toString() {
- return elementName + (relative? " -> " : " => ") + path;
+ return elementName + (relative? " -> " : " => ") + path.getPath();
}
}
@@ -141,14 +131,15 @@
* @return true if the element is externally documented
*/
public boolean isExternal(Element element) {
- if (elementToItemMap == null) {
+ if (packageItems.isEmpty()) {
return false;
}
PackageElement pe = configuration.utils.containingPackage(element);
if (pe.isUnnamed()) {
return false;
}
- return elementToItemMap.get(configuration.utils.getPackageName(pe)) != null;
+
+ return findElementItem(pe) != null;
}
/**
@@ -158,25 +149,25 @@
* @return true if the element is a module
*/
public boolean isModule(String elementName) {
- Item elem = findElementItem(elementName);
- return (elem == null) ? false : elem.isModule;
+ Item elem = moduleItems.get(elementName);
+ return (elem == null) ? false : true;
}
/**
* Convert a link to be an external link if appropriate.
*
- * @param elemName The element name.
+ * @param element The element .
* @param relativepath The relative path.
* @param filename The link to convert.
* @return if external return converted link else return null
*/
- public DocLink getExternalLink(String elemName, DocPath relativepath, String filename) {
- return getExternalLink(elemName, relativepath, filename, null);
+ public DocLink getExternalLink(Element element, DocPath relativepath, String filename) {
+ return getExternalLink(element, relativepath, filename, null);
}
- public DocLink getExternalLink(String elemName, DocPath relativepath, String filename,
+ public DocLink getExternalLink(Element element, DocPath relativepath, String filename,
String memberName) {
- Item fnd = findElementItem(elemName);
+ Item fnd = findElementItem(element);
if (fnd == null)
return null;
@@ -184,7 +175,7 @@
// to contain external URLs!
DocPath p = fnd.relative ?
relativepath.resolve(fnd.path).resolve(filename) :
- DocPath.create(fnd.path).resolve(filename);
+ fnd.path.resolve(filename);
return new DocLink(p, "is-external=true", memberName);
}
@@ -266,13 +257,20 @@
/**
* Get the Extern Item object associated with this element name.
*
- * @param elemName Element name.
+ * @param element Element
*/
- private Item findElementItem(String elemName) {
- if (elementToItemMap == null) {
- return null;
+ private Item findElementItem(Element element) {
+ Item item = null;
+ if (element instanceof ModuleElement) {
+ item = moduleItems.get(configuration.utils.getModuleName((ModuleElement)element));
}
- return elementToItemMap.get(elemName);
+ else if (element instanceof PackageElement) {
+ PackageElement packageElement = (PackageElement)element;
+ ModuleElement moduleElement = configuration.utils.containingModule(packageElement);
+ Map<String, Item> pkgMap = packageItems.get(configuration.utils.getModuleName(moduleElement));
+ item = (pkgMap != null) ? pkgMap.get(configuration.utils.getPackageName(packageElement)) : null;
+ }
+ return item;
}
/**
@@ -370,23 +368,34 @@
* @throws IOException if there is a problem reading or closing the stream
*/
private void readElementList(InputStream input, String path, boolean relative)
- throws IOException {
+ throws Fault, IOException {
try (BufferedReader in = new BufferedReader(new InputStreamReader(input))) {
- in.lines().forEach((elemname) -> {
+ String elemname = null;
+ String moduleName = null;
+ DocPath elempath = null;
+ DocPath basePath = DocPath.create(path);
+ while ((elemname = in.readLine()) != null) {
if (elemname.length() > 0) {
- boolean module;
- String elempath;
+ elempath = basePath;
if (elemname.startsWith(DocletConstants.MODULE_PREFIX)) {
- elemname = elemname.replace(DocletConstants.MODULE_PREFIX, "");
- elempath = path;
- module = true;
+ moduleName = elemname.replace(DocletConstants.MODULE_PREFIX, "");
+ Item item = new Item(moduleName, elempath, relative);
+ moduleItems.put(moduleName, item);
} else {
- elempath = path + elemname.replace('.', '/') + '/';
- module = false;
+ DocPath pkgPath = DocPath.create(elemname.replace('.', '/'));
+ if (configuration.useModuleDirectories && moduleName != null) {
+ elempath = elempath.resolve(DocPath.create(moduleName).resolve(pkgPath));
+ } else {
+ elempath = elempath.resolve(pkgPath);
+ }
+ checkLinkCompatibility(elemname, moduleName, path);
+ Item item = new Item(elemname, elempath, relative);
+ packageItems.computeIfAbsent(moduleName == null ?
+ DocletConstants.DEFAULT_ELEMENT_NAME : moduleName, k -> new TreeMap<>())
+ .put(elemname, item);
}
- Item ignore = new Item(elemname, elempath, relative, module);
}
- });
+ }
}
}
@@ -400,4 +409,18 @@
return false;
}
}
+
+ private void checkLinkCompatibility(String packageName, String moduleName, String path) throws Fault {
+ PackageElement pe = configuration.utils.elementUtils.getPackageElement(packageName);
+ if (pe != null) {
+ ModuleElement me = (ModuleElement)pe.getEnclosingElement();
+ if (me == null || me.isUnnamed()) {
+ if (moduleName != null)
+ throw new Fault(configuration.getText("doclet.linkMismatch_PackagedLinkedtoModule",
+ path), null);
+ } else if (moduleName == null)
+ throw new Fault(configuration.getText("doclet.linkMismatch_ModuleLinkedtoPackage",
+ path), null);
+ }
+ }
}
--- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/ToolOption.java Wed Sep 26 18:36:55 2018 +0100
+++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/ToolOption.java Thu Sep 27 10:49:10 2018 -0700
@@ -146,7 +146,7 @@
}
},
- SOURCE("-source", STANDARD, true) {
+ SOURCE("--source -source", STANDARD, true) {
@Override
public void process(Helper helper, String arg) throws InvalidValueException {
Option.SOURCE.process(helper.getOptionHelper(), primaryName, arg);
--- a/src/jdk.jdwp.agent/unix/native/libjdwp/util_md.h Wed Sep 26 18:36:55 2018 +0100
+++ b/src/jdk.jdwp.agent/unix/native/libjdwp/util_md.h Thu Sep 27 10:49:10 2018 -0700
@@ -33,7 +33,7 @@
#include <sys/types.h>
#ifdef _ALLBSD_SOURCE
#include <machine/endian.h>
-#elif __linux__
+#elif defined(__linux__)
#include <endian.h>
#endif
--- a/src/jdk.jfr/share/conf/jfr/default.jfc Wed Sep 26 18:36:55 2018 +0100
+++ b/src/jdk.jfr/share/conf/jfr/default.jfc Thu Sep 27 10:49:10 2018 -0700
@@ -382,6 +382,11 @@
<setting name="enabled" control="gc-enabled-normal">true</setting>
</event>
+ <event name="jdk.GCPhaseParallel">
+ <setting name="enabled" control="gc-enabled-normal">true</setting>
+ <setting name="threshold">0 ms</setting>
+ </event>
+
<event name="jdk.G1BasicIHOP">
<setting name="enabled" control="gc-enabled-normal">true</setting>
</event>
--- a/src/jdk.jfr/share/conf/jfr/profile.jfc Wed Sep 26 18:36:55 2018 +0100
+++ b/src/jdk.jfr/share/conf/jfr/profile.jfc Thu Sep 27 10:49:10 2018 -0700
@@ -382,6 +382,11 @@
<setting name="enabled" control="gc-enabled-normal">true</setting>
</event>
+ <event name="jdk.GCPhaseParallel">
+ <setting name="enabled" control="gc-enabled-normal">true</setting>
+ <setting name="threshold">0 ms</setting>
+ </event>
+
<event name="jdk.G1BasicIHOP">
<setting name="enabled" control="gc-enabled-normal">true</setting>
</event>
--- a/src/jdk.unsupported/share/classes/sun/reflect/ReflectionFactory.java Wed Sep 26 18:36:55 2018 +0100
+++ b/src/jdk.unsupported/share/classes/sun/reflect/ReflectionFactory.java Thu Sep 27 10:49:10 2018 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2001, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -29,14 +29,9 @@
import java.lang.invoke.MethodHandle;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.UndeclaredThrowableException;
-import java.security.AccessControlContext;
import java.security.AccessController;
import java.security.Permission;
-import java.security.ProtectionDomain;
import java.security.PrivilegedAction;
-import jdk.internal.misc.SharedSecrets;
-import jdk.internal.misc.JavaSecurityAccess;
/**
* ReflectionFactory supports custom serialization.
@@ -145,66 +140,6 @@
}
/**
- * Invokes the supplied constructor, adding the provided protection domains
- * to the invocation stack before invoking {@code Constructor::newInstance}.
- * If no {@linkplain System#getSecurityManager() security manager} is present,
- * or no domains are provided, then this method simply calls
- * {@code cons.newInstance()}. Otherwise, it invokes the provided constructor
- * with privileges at the intersection of the current context and the provided
- * protection domains.
- *
- * @param cons A constructor obtained from {@code
- * newConstructorForSerialization} or {@code
- * newConstructorForExternalization}.
- * @param domains An array of protection domains that limit the privileges
- * with which the constructor is invoked. Can be {@code null}
- * or empty, in which case privileges are only limited by the
- * {@linkplain AccessController#getContext() current context}.
- *
- * @return A new object built from the provided constructor.
- *
- * @throws NullPointerException if {@code cons} is {@code null}.
- * @throws InstantiationException if thrown by {@code cons.newInstance()}.
- * @throws InvocationTargetException if thrown by {@code cons.newInstance()}.
- * @throws IllegalAccessException if thrown by {@code cons.newInstance()}.
- */
- public final Object newInstanceForSerialization(Constructor<?> cons,
- ProtectionDomain[] domains)
- throws InstantiationException, InvocationTargetException, IllegalAccessException
- {
- SecurityManager sm = System.getSecurityManager();
- if (sm == null || domains == null || domains.length == 0) {
- return cons.newInstance();
- } else {
- JavaSecurityAccess jsa = SharedSecrets.getJavaSecurityAccess();
- PrivilegedAction<?> pea = () -> {
- try {
- return cons.newInstance();
- } catch (InstantiationException
- | InvocationTargetException
- | IllegalAccessException x) {
- throw new UndeclaredThrowableException(x);
- }
- }; // Can't use PrivilegedExceptionAction with jsa
- try {
- return jsa.doIntersectionPrivilege(pea,
- AccessController.getContext(),
- new AccessControlContext(domains));
- } catch (UndeclaredThrowableException x) {
- Throwable cause = x.getCause();
- if (cause instanceof InstantiationException)
- throw (InstantiationException) cause;
- if (cause instanceof InvocationTargetException)
- throw (InvocationTargetException) cause;
- if (cause instanceof IllegalAccessException)
- throw (IllegalAccessException) cause;
- // not supposed to happen
- throw x;
- }
- }
- }
-
- /**
* Returns a direct MethodHandle for the {@code readObjectNoData} method on
* a Serializable class.
* The first argument of {@link MethodHandle#invoke} is the serializable
--- a/test/TestCommon.gmk Wed Sep 26 18:36:55 2018 +0100
+++ b/test/TestCommon.gmk Thu Sep 27 10:49:10 2018 -0700
@@ -453,8 +453,8 @@
# Set other vm and test options
JTREG_TEST_OPTIONS += $(JAVA_ARGS:%=-javaoptions:%) $(JAVA_VM_ARGS:%=-vmoption:%)
-ifneq ($(JIB_JAR), )
- JTREG_BASIC_OPTIONS += -cpa:$(shell $(GETMIXEDPATH) "$(JIB_JAR)")
+ifneq ($(JIB_HOME), )
+ JTREG_BASIC_OPTIONS += -e:JIB_HOME=$(shell $(GETMIXEDPATH) "$(JIB_HOME)")
endif
ifeq ($(IGNORE_MARKED_TESTS), true)
# Option to tell jtreg to not run tests marked with "ignore"
--- a/test/hotspot/gtest/code/test_dependencyContext.cpp Wed Sep 26 18:36:55 2018 +0100
+++ b/test/hotspot/gtest/code/test_dependencyContext.cpp Thu Sep 27 10:49:10 2018 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -50,7 +50,7 @@
}
~TestDependencyContext() {
- dependencies().wipe();
+ wipe();
CodeCache_lock->unlock();
}
@@ -63,6 +63,18 @@
return ctx.find_stale_entries();
}
#endif
+
+ void wipe() {
+ DependencyContext ctx(&_dependency_context);
+ nmethodBucket* b = ctx.dependencies();
+ ctx.set_dependencies(NULL);
+ ctx.set_has_stale_entries(false);
+ while (b != NULL) {
+ nmethodBucket* next = b->next();
+ delete b;
+ b = next;
+ }
+ }
};
static void test_remove_dependent_nmethod(int id, bool delete_immediately) {
--- a/test/hotspot/jtreg/ProblemList-graal.txt Wed Sep 26 18:36:55 2018 +0100
+++ b/test/hotspot/jtreg/ProblemList-graal.txt Thu Sep 27 10:49:10 2018 -0700
@@ -175,7 +175,7 @@
org.graalvm.compiler.replacements.test.classfile.RedefineIntrinsicTest 8205081
org.graalvm.compiler.core.test.deopt.CompiledMethodTest 8202955
-org.graalvm.compiler.core.test.CountedLoopTest 8199885
+org.graalvm.compiler.core.test.CountedLoopTest 8211179
org.graalvm.compiler.debug.test.DebugContextTest 8203504
org.graalvm.compiler.hotspot.test.GraalOSRTest 8206947
--- a/test/hotspot/jtreg/ProblemList.txt Wed Sep 26 18:36:55 2018 +0100
+++ b/test/hotspot/jtreg/ProblemList.txt Thu Sep 27 10:49:10 2018 -0700
@@ -59,6 +59,8 @@
compiler/cpuflags/TestAESIntrinsicsOnSupportedConfig.java 8190680 generic-all
+compiler/whitebox/ForceNMethodSweepTest.java 8211129 generic-all
+
#############################################################################
# :hotspot_gc
@@ -84,6 +86,7 @@
runtime/CompressedOops/UseCompressedOops.java 8079353 generic-all
runtime/RedefineTests/RedefineRunningMethods.java 8208778 macosx-x64
runtime/SharedArchiveFile/SASymbolTableTest.java 8193639 solaris-all
+runtime/XCheckJniJsig/XCheckJSig.java 8211084 macosx-x64
#############################################################################
--- a/test/hotspot/jtreg/compiler/graalunit/CoreTest.java Wed Sep 26 18:36:55 2018 +0100
+++ b/test/hotspot/jtreg/compiler/graalunit/CoreTest.java Thu Sep 27 10:49:10 2018 -0700
@@ -25,7 +25,7 @@
* @test
* @summary
* @requires vm.opt.final.EnableJVMCI == true
- *
+ * @requires !vm.graal.enabled
* @modules jdk.internal.vm.compiler
*
* @library /test/lib /compiler/graalunit /
--- a/test/hotspot/jtreg/compiler/graalunit/TestPackages.txt Wed Sep 26 18:36:55 2018 +0100
+++ b/test/hotspot/jtreg/compiler/graalunit/TestPackages.txt Thu Sep 27 10:49:10 2018 -0700
@@ -6,7 +6,7 @@
AsmSparc org.graalvm.compiler.asm.sparc.test
CoreAmd64 org.graalvm.compiler.core.amd64.test
CoreSparc org.graalvm.compiler.core.sparc.test @requires vm.simpleArch == "sparcv9"
-Core org.graalvm.compiler.core.test
+Core org.graalvm.compiler.core.test @requires !vm.graal.enabled
Debug org.graalvm.compiler.debug.test
Graph org.graalvm.compiler.graph.test @requires vm.graal.enabled
HotspotAmd64 org.graalvm.compiler.hotspot.amd64.test
--- a/test/hotspot/jtreg/runtime/CommandLine/VMDeprecatedOptions.java Wed Sep 26 18:36:55 2018 +0100
+++ b/test/hotspot/jtreg/runtime/CommandLine/VMDeprecatedOptions.java Thu Sep 27 10:49:10 2018 -0700
@@ -46,6 +46,7 @@
{"InitialRAMFraction", "64"},
{"AssumeMP", "false"},
{"UseMembar", "true"},
+ {"TLABStats", "false"},
// deprecated alias flags (see also aliased_jvm_flags):
{"DefaultMaxRAMFraction", "4"},
--- a/test/hotspot/jtreg/runtime/appcds/GraalWithLimitedMetaspace.java Wed Sep 26 18:36:55 2018 +0100
+++ b/test/hotspot/jtreg/runtime/appcds/GraalWithLimitedMetaspace.java Thu Sep 27 10:49:10 2018 -0700
@@ -87,7 +87,6 @@
static void dumpLoadedClasses(String[] expectedClasses) throws Exception {
ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(true,
- TestCommon.makeCommandLineForAppCDS(
"-XX:DumpLoadedClassList=" + CLASSLIST_FILE,
// trigger JVMCI runtime init so that JVMCI classes will be
// included in the classlist
@@ -95,7 +94,7 @@
"-cp",
TESTJAR,
TESTNAME,
- TEST_OUT));
+ TEST_OUT);
OutputAnalyzer output = TestCommon.executeAndLog(pb, "dump-loaded-classes")
.shouldHaveExitValue(0)
@@ -113,7 +112,6 @@
static void dumpArchive() throws Exception {
ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(true,
- TestCommon.makeCommandLineForAppCDS(
"-cp",
TESTJAR,
"-XX:SharedClassListFile=" + CLASSLIST_FILE,
@@ -121,7 +119,7 @@
"-Xlog:cds",
"-Xshare:dump",
"-XX:MetaspaceSize=12M",
- "-XX:MaxMetaspaceSize=12M"));
+ "-XX:MaxMetaspaceSize=12M");
OutputAnalyzer output = TestCommon.executeAndLog(pb, "dump-archive");
int exitValue = output.getExitValue();
--- a/test/hotspot/jtreg/runtime/appcds/TestCommon.java Wed Sep 26 18:36:55 2018 +0100
+++ b/test/hotspot/jtreg/runtime/appcds/TestCommon.java Thu Sep 27 10:49:10 2018 -0700
@@ -110,10 +110,6 @@
return createArchive(opts);
}
- public static String[] makeCommandLineForAppCDS(String... args) throws Exception {
- return args;
- }
-
// Create AppCDS archive using appcds options
public static OutputAnalyzer createArchive(AppCDSOptions opts)
throws Exception {
@@ -143,7 +139,7 @@
for (String s : opts.suffix) cmd.add(s);
String[] cmdLine = cmd.toArray(new String[cmd.size()]);
- ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(true, makeCommandLineForAppCDS(cmdLine));
+ ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(true, cmdLine);
return executeAndLog(pb, "dump");
}
@@ -169,7 +165,7 @@
for (String s : opts.suffix) cmd.add(s);
String[] cmdLine = cmd.toArray(new String[cmd.size()]);
- ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(true, makeCommandLineForAppCDS(cmdLine));
+ ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(true, cmdLine);
return executeAndLog(pb, "exec");
}
--- a/test/hotspot/jtreg/runtime/appcds/sharedStrings/SharedStringsBasic.java Wed Sep 26 18:36:55 2018 +0100
+++ b/test/hotspot/jtreg/runtime/appcds/sharedStrings/SharedStringsBasic.java Thu Sep 27 10:49:10 2018 -0700
@@ -49,24 +49,22 @@
TestCommon.getSourceFile("SharedStringsBasic.txt").toString();
ProcessBuilder dumpPb = ProcessTools.createJavaProcessBuilder(true,
- TestCommon.makeCommandLineForAppCDS(
"-cp", appJar,
"-XX:SharedArchiveConfigFile=" + sharedArchiveConfigFile,
"-XX:SharedArchiveFile=./SharedStringsBasic.jsa",
"-Xshare:dump",
- "-Xlog:cds,cds+hashtables"));
+ "-Xlog:cds,cds+hashtables");
TestCommon.executeAndLog(dumpPb, "dump")
.shouldContain("Shared string table stats")
.shouldHaveExitValue(0);
ProcessBuilder runPb = ProcessTools.createJavaProcessBuilder(true,
- TestCommon.makeCommandLineForAppCDS(
"-cp", appJar,
"-XX:SharedArchiveFile=./SharedStringsBasic.jsa",
"-Xshare:auto",
"-showversion",
- "HelloString"));
+ "HelloString");
TestCommon.executeAndLog(runPb, "run").shouldHaveExitValue(0);
}
--- a/test/hotspot/jtreg/runtime/appcds/sharedStrings/SysDictCrash.java Wed Sep 26 18:36:55 2018 +0100
+++ b/test/hotspot/jtreg/runtime/appcds/sharedStrings/SysDictCrash.java Thu Sep 27 10:49:10 2018 -0700
@@ -44,21 +44,19 @@
// SharedBaseAddress=0 puts the archive at a very high address on solaris,
// which provokes the crash.
ProcessBuilder dumpPb = ProcessTools.createJavaProcessBuilder(true,
- TestCommon.makeCommandLineForAppCDS(
"-XX:+UseG1GC", "-XX:MaxRAMPercentage=12.5",
"-cp", ".",
"-XX:SharedBaseAddress=0", "-XX:SharedArchiveFile=./SysDictCrash.jsa",
"-Xshare:dump",
- "-showversion", "-Xlog:cds,cds+hashtables"));
+ "-showversion", "-Xlog:cds,cds+hashtables");
TestCommon.checkDump(TestCommon.executeAndLog(dumpPb, "dump"));
ProcessBuilder runPb = ProcessTools.createJavaProcessBuilder(true,
- TestCommon.makeCommandLineForAppCDS(
"-XX:+UseG1GC", "-XX:MaxRAMPercentage=12.5",
"-XX:SharedArchiveFile=./SysDictCrash.jsa",
"-Xshare:on",
- "-version"));
+ "-version");
TestCommon.checkExec(TestCommon.executeAndLog(runPb, "exec"));
}
--- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/Breakpoint/breakpoint001/breakpoint001.cpp Wed Sep 26 18:36:55 2018 +0100
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/Breakpoint/breakpoint001/breakpoint001.cpp Thu Sep 27 10:49:10 2018 -0700
@@ -94,9 +94,10 @@
"failed to obtain a class signature\n");
if (sig != NULL && (strcmp(sig, CLASS_SIG) == 0)) {
- NSK_DISPLAY1("ClassLoad event received for the class \"%s\"\n\
-\tsetting breakpoints ...\n",
- sig);
+ NSK_DISPLAY1(
+ "ClassLoad event received for the class \"%s\"\n"
+ "\tsetting breakpoints ...\n",
+ sig);
setBP(jvmti_env, env, klass);
}
}
@@ -126,8 +127,9 @@
strcmp(thr_info.name,THREAD_NAME) != 0 ||
thr_info.is_daemon==JNI_TRUE) {
result = checkStatus = STATUS_FAILED;
- NSK_COMPLAIN2("TEST FAILED: Breakpoint event with unexpected thread info:\n\
-\tname: \"%s\"\ttype: %s thread\n\n",
+ NSK_COMPLAIN2(
+ "TEST FAILED: Breakpoint event with unexpected thread info:\n"
+ "\tname: \"%s\"\ttype: %s thread\n\n",
(thr_info.name == NULL)?"NULL":thr_info.name,
(thr_info.is_daemon==JNI_TRUE)?"deamon":"user");
}
@@ -161,9 +163,10 @@
if (clsSig == NULL ||
strcmp(clsSig,CLASS_SIG) != 0) {
result = checkStatus = STATUS_FAILED;
- NSK_COMPLAIN1("TEST FAILED: Breakpoint event with unexpected class signature:\n\
-\t\"%s\"\n\n",
- (clsSig == NULL)?"NULL":clsSig);
+ NSK_COMPLAIN1(
+ "TEST FAILED: Breakpoint event with unexpected class signature:\n"
+ "\t\"%s\"\n\n",
+ (clsSig == NULL) ? "NULL" : clsSig);
}
else
NSK_DISPLAY1("CHECK PASSED: class signature: \"%s\"\n",
@@ -220,8 +223,10 @@
for (i=0; i<METH_NUM; i++) {
if (bpEvents[i] != 1) {
result = STATUS_FAILED;
- NSK_COMPLAIN3("TEST FAILED: wrong number of Breakpoint events\n\
-\tfor the method \"%s %s\":\n\t\tgot: %d\texpected: 1\n",
+ NSK_COMPLAIN3(
+ "TEST FAILED: wrong number of Breakpoint events\n"
+ "\tfor the method \"%s %s\":\n"
+ "\t\tgot: %d\texpected: 1\n",
METHODS[i][0], METHODS[i][1], bpEvents[i]);
}
else
--- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/ClassLoad/classload001/classload001.cpp Wed Sep 26 18:36:55 2018 +0100
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/ClassLoad/classload001/classload001.cpp Thu Sep 27 10:49:10 2018 -0700
@@ -133,8 +133,9 @@
else if ((i = findSig(sig, 0)) != -1) {
result = STATUS_FAILED;
primClsEvents[i]++;
- NSK_COMPLAIN1("TEST FAILED: JVMTI_EVENT_CLASS_LOAD event received for\n\
-\t a primitive class/array of primitive types with the signature \"%s\"\n",
+ NSK_COMPLAIN1(
+ "TEST FAILED: JVMTI_EVENT_CLASS_LOAD event received for\n"
+ "\t a primitive class/array of primitive types with the signature \"%s\"\n",
sig);
}
--- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/GarbageCollectionStart/gcstart001/gcstart001.cpp Wed Sep 26 18:36:55 2018 +0100
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/GarbageCollectionStart/gcstart001/gcstart001.cpp Thu Sep 27 10:49:10 2018 -0700
@@ -52,8 +52,9 @@
if (gcstart != (gcfinish+1)) {
result = STATUS_FAILED;
- NSK_COMPLAIN2("TEST FAILED: GarbageCollectionStart event has no a matched pair GarbageCollectionFinish:\n\
-\t%d GarbageCollectionStart events\t%d GarbageCollectionFinish events\n\n",
+ NSK_COMPLAIN2(
+ "TEST FAILED: GarbageCollectionStart event has no a matched pair GarbageCollectionFinish:\n"
+ "\t%d GarbageCollectionStart events\t%d GarbageCollectionFinish events\n\n",
gcstart, gcfinish);
}
else
@@ -68,8 +69,9 @@
if (gcstart != gcfinish) {
result = STATUS_FAILED;
- NSK_COMPLAIN2("TEST FAILED: GarbageCollectionFinish event has no a matched pair GarbageCollectionStart:\n\
-\t%d GarbageCollectionStart events\t%d GarbageCollectionFinish events\n\n",
+ NSK_COMPLAIN2(
+ "TEST FAILED: GarbageCollectionFinish event has no a matched pair GarbageCollectionStart:\n"
+ "\t%d GarbageCollectionStart events\t%d GarbageCollectionFinish events\n\n",
gcstart, gcfinish);
}
else
@@ -81,8 +83,9 @@
NSK_DISPLAY0("VMDeath event received\n");
if (gcstart != gcfinish || result == STATUS_FAILED) {
- NSK_COMPLAIN2("TEST FAILED: some GarbageCollectionFinish events have no a matched pair GarbageCollectionStart:\n\
-\t%d GarbageCollectionStart events\t%d GarbageCollectionFinish events\n\n",
+ NSK_COMPLAIN2(
+ "TEST FAILED: some GarbageCollectionFinish events have no a matched pair GarbageCollectionStart:\n"
+ "\t%d GarbageCollectionStart events\t%d GarbageCollectionFinish events\n\n",
gcstart, gcfinish);
exit(95 + STATUS_FAILED);
--- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/GetClassSignature/getclsig006/getclsig006.cpp Wed Sep 26 18:36:55 2018 +0100
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/GetClassSignature/getclsig006/getclsig006.cpp Thu Sep 27 10:49:10 2018 -0700
@@ -69,8 +69,12 @@
if (strcmp(class_sig[idx][1], sign) != 0 ||
strcmp(class_sig[idx][2], (gen_sign==NULL)?"NULL":gen_sign) != 0) {
- NSK_COMPLAIN5("TEST FAILED: class: \"%s\" \
-has\n\tsignature: \"%s\"\n\tgeneric signature: \"%s\"\n\n\tExpected: \"%s\"\n\t\"%s\"\n\n",
+ NSK_COMPLAIN5(
+ "TEST FAILED: class: \"%s\" has\n"
+ "\tsignature: \"%s\"\n"
+ "\tgeneric signature: \"%s\"\n\n"
+ "\tExpected: \"%s\"\n"
+ "\t\"%s\"\n\n",
class_sig[idx][0],
sign, (gen_sign==NULL)?"NULL":gen_sign,
class_sig[idx][1], class_sig[idx][2]);
--- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/GetFieldName/getfldnm005/getfldnm005.cpp Wed Sep 26 18:36:55 2018 +0100
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/GetFieldName/getfldnm005/getfldnm005.cpp Thu Sep 27 10:49:10 2018 -0700
@@ -103,8 +103,12 @@
if (strcmp(fld_sig[idx][2], sign) != 0 ||
strcmp(fld_sig[idx][3], (gen_sign==NULL)?"NULL":gen_sign) != 0) {
- NSK_COMPLAIN6("TEST FAILED: %s field \"%s\" \
-has\n\tsignature: \"%s\"\n\tgeneric signature: \"%s\"\n\n\tExpected: \"%s\"\n\t\t\"%s\"\n\n",
+ NSK_COMPLAIN6(
+ "TEST FAILED: %s field \"%s\" has\n"
+ "\tsignature: \"%s\"\n"
+ "\tgeneric signature: \"%s\"\n\n"
+ "\tExpected: \"%s\"\n"
+ "\t\t\"%s\"\n\n",
(instance==0)?"instance":"static",
fld_sig[idx][0],
sign, (gen_sign==NULL)?"NULL":gen_sign,
--- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/GetJNIFunctionTable/getjniftab002/getjniftab002.cpp Wed Sep 26 18:36:55 2018 +0100
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/GetJNIFunctionTable/getjniftab002/getjniftab002.cpp Thu Sep 27 10:49:10 2018 -0700
@@ -80,11 +80,12 @@
only since JDK 1.2 */
if (verbose)
printf("\nb) Checking the function with the detached thread ...\n\ndetaching the main thread ...\n");
- if ((err = vm->DetachCurrentThread()) != 0)
- printf("(%s,%d): Warning: DetachCurrentThread() returns: %d\n\
-\tcheck with the detached main thread skipped\n",
+ if ((err = vm->DetachCurrentThread()) != 0) {
+ printf(
+ "(%s,%d): Warning: DetachCurrentThread() returns: %d\n"
+ "\tcheck with the detached main thread skipped\n",
__FILE__, __LINE__, err);
- else {
+ } else {
redirect(env, JVMTI_ERROR_UNATTACHED_THREAD);
if (verbose)
--- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/GetLocalVariableTable/localtab004/localtab004.cpp Wed Sep 26 18:36:55 2018 +0100
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/GetLocalVariableTable/localtab004/localtab004.cpp Thu Sep 27 10:49:10 2018 -0700
@@ -107,8 +107,7 @@
jni_env, testedCls,
methInfo[i].m_name, methInfo[i].m_sign);
if (methInfo[i].mid == NULL) {
- NSK_COMPLAIN3("TEST FAILURE: unable to get the method ID for the %s method\
- \"%s\", signature \"%s\"\n\n",
+ NSK_COMPLAIN3("TEST FAILURE: unable to get the method ID for the %s method \"%s\", signature \"%s\"\n\n",
methInfo[i].inst?"instance":"static",
methInfo[i].m_name, methInfo[i].m_sign);
return STATUS_FAILED;
@@ -124,8 +123,9 @@
} else {
if (count != methInfo[i].vcount) {
totRes = STATUS_FAILED;
- NSK_COMPLAIN5("TEST FAILED: %s method \"%s\", signature \"%s\":\
- found %d vars in the LocalVariableTable, expected %d\n\tHere are the found vars:\n",
+ NSK_COMPLAIN5(
+ "TEST FAILED: %s method \"%s\", signature \"%s\": found %d vars in the LocalVariableTable, expected %d\n"
+ "\tHere are the found vars:\n",
methInfo[i].inst?"instance":"static",
methInfo[i].m_name, methInfo[i].m_sign,
count, methInfo[i].vcount);
@@ -136,18 +136,21 @@
continue;
}
- else
- NSK_DISPLAY4("Checking vars in the LocalVariableTable of the %s method \"%s\",\
- signature \"%s\" ...\n\tfound %d local vars as expected\n",
+ else {
+ NSK_DISPLAY4(
+ "Checking vars in the LocalVariableTable of the %s method \"%s\", signature \"%s\" ...\n"
+ "\tfound %d local vars as expected\n",
methInfo[i].inst?"instance":"static",
methInfo[i].m_name, methInfo[i].m_sign, count);
+ }
for (j=0; j<count; j++) {
for (k=0; k<count; k++) {
if (strcmp(lv_table[j].name, methInfo[i].vars[k].v_name) == 0) {
if (strcmp(lv_table[j].signature, methInfo[i].vars[k].v_sign) != 0) {
- NSK_COMPLAIN6("TEST FAILED: %s method: \"%s\", signature: \"%s\": var \"%s\"\
- has signature \"%s\" in the LocalVariableTable, expected \"%s\"\n\n",
+ NSK_COMPLAIN6(
+ "TEST FAILED: %s method: \"%s\", signature: \"%s\": var \"%s\" "
+ "has signature \"%s\" in the LocalVariableTable, expected \"%s\"\n\n",
methInfo[i].inst?"instance":"static",
methInfo[i].m_name, methInfo[i].m_sign,
lv_table[j].name, lv_table[j].signature,
--- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/GetLocalVariableTable/localtab005/localtab005.cpp Wed Sep 26 18:36:55 2018 +0100
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/GetLocalVariableTable/localtab005/localtab005.cpp Thu Sep 27 10:49:10 2018 -0700
@@ -115,8 +115,7 @@
jni_env, testedCls,
methInfo[i].m_name, methInfo[i].m_sign);
if (methInfo[i].mid == NULL) {
- NSK_COMPLAIN3("TEST FAILURE: unable to get the method ID for the %s method\
- \"%s\", signature \"%s\"\n\n",
+ NSK_COMPLAIN3("TEST FAILURE: unable to get the method ID for the %s method \"%s\", signature \"%s\"\n\n",
methInfo[i].inst?"instance":"static",
methInfo[i].m_name, methInfo[i].m_sign);
return STATUS_FAILED;
@@ -132,8 +131,10 @@
} else {
if (count != methInfo[i].vcount) {
totRes = STATUS_FAILED;
- NSK_COMPLAIN5("TEST FAILED: %s method \"%s\", signature \"%s\":\
- found %d vars in the LocalVariableTable, expected %d\n\tHere are the found vars:\n",
+ NSK_COMPLAIN5(
+ "TEST FAILED: %s method \"%s\", signature \"%s\":"
+ "found %d vars in the LocalVariableTable, expected %d\n"
+ "\tHere are the found vars:\n",
methInfo[i].inst?"instance":"static",
methInfo[i].m_name, methInfo[i].m_sign,
count, methInfo[i].vcount);
@@ -146,11 +147,14 @@
continue;
}
- else
- NSK_DISPLAY4(">>> Checking vars in the LocalVariableTable of the %s method \"%s\",\
- signature \"%s\" ...\n\t%d local vars as expected\n",
+ else {
+ NSK_DISPLAY4(
+ ">>> Checking vars in the LocalVariableTable of the %s method \"%s\","
+ "signature \"%s\" ...\n"
+ "\t%d local vars as expected\n",
methInfo[i].inst?"instance":"static",
methInfo[i].m_name, methInfo[i].m_sign, count);
+ }
for (j=0; j<count; j++) {
for (k=0; k<count; k++) {
@@ -158,8 +162,11 @@
if ((strcmp(lv_table[j].signature, methInfo[i].vars[k].v_sign) != 0) ||
(strcmp((lv_table[j].generic_signature==NULL)?"NULL":lv_table[j].generic_signature,
methInfo[i].vars[k].v_gen_sign) != 0)) {
- NSK_COMPLAIN8("TEST FAILED: %s method: \"%s\" \"%s\":\n\tvar \"%s\"\
- has signature \"%s\",\n\tgeneric signature \"%s\"\n\n\tExpected: \"%s\"\n\t\t\"%s\"\n\n",
+ NSK_COMPLAIN8(
+ "TEST FAILED: %s method: \"%s\" \"%s\":\n"
+ "\tvar \"%s\" has signature \"%s\",\n"
+ "\tgeneric signature \"%s\"\n\n"
+ "\tExpected: \"%s\"\n\t\t\"%s\"\n\n",
methInfo[i].inst?"instance":"static",
methInfo[i].m_name, methInfo[i].m_sign,
lv_table[j].name, lv_table[j].signature,
--- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/NativeMethodBind/nativemethbind001/nativemethbind001.cpp Wed Sep 26 18:36:55 2018 +0100
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/NativeMethodBind/nativemethbind001/nativemethbind001.cpp Thu Sep 27 10:49:10 2018 -0700
@@ -110,8 +110,9 @@
(strcmp(methSig,METHODS[i][1]) == 0)) {
bindEv[i][0]++;
- NSK_DISPLAY1("CHECK PASSED: NativeMethodBind event received for the method:\n\
-\t\"%s\" as expected\n",
+ NSK_DISPLAY1(
+ "CHECK PASSED: NativeMethodBind event received for the method:\n"
+ "\t\"%s\" as expected\n",
methNam);
break;
}
@@ -163,8 +164,8 @@
meth.signature = (char *) METHODS[1][1];
meth.fnPtr = (void *) &anotherNativeMethod;
- NSK_DISPLAY3("Calling RegisterNatives() with \"%s %s\"\n\
-\tfor class \"%s\" ...\n",
+ NSK_DISPLAY3("Calling RegisterNatives() with \"%s %s\"\n"
+ "\tfor class \"%s\" ...\n",
METHODS[1][0], METHODS[1][1], CLASS_SIG);
if (!NSK_JNI_VERIFY_VOID(env, (NSK_CPP_STUB4(RegisterNatives,
env, testedCls, &meth, 1)) != 0)) {
@@ -187,8 +188,9 @@
}
else {
result = STATUS_FAILED;
- NSK_COMPLAIN3("TEST FAILED: wrong number of NativeMethodBind events for the method \"%s\":\n\
-got: %d\texpected: %d\n\n",
+ NSK_COMPLAIN3(
+ "TEST FAILED: wrong number of NativeMethodBind events for the method \"%s\":\n"
+ "got: %d\texpected: %d\n\n",
METHODS[i][0], bindEv[i][0], bindEv[i][1]);
}
--- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/NativeMethodBind/nativemethbind002/nativemethbind002.cpp Wed Sep 26 18:36:55 2018 +0100
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/NativeMethodBind/nativemethbind002/nativemethbind002.cpp Thu Sep 27 10:49:10 2018 -0700
@@ -67,8 +67,9 @@
if (!NSK_JVMTI_VERIFY(NSK_CPP_STUB2(GetPhase,
jvmti_env, &phase))) {
result = STATUS_FAILED;
- NSK_COMPLAIN0("TEST FAILED: unable to obtain phase of the VM execution\n\
-\tduring NativeMethodBind callback\n\n");
+ NSK_COMPLAIN0(
+ "TEST FAILED: unable to obtain phase of the VM execution\n"
+ "\tduring NativeMethodBind callback\n\n");
unlock(jvmti_env, jni_env);
return;
}
@@ -103,10 +104,12 @@
VMDeath(jvmtiEnv *jvmti_env, JNIEnv *env) {
NSK_DISPLAY0("VMDeath event received\n");
- if (wrongBindEv != 0)
- NSK_COMPLAIN1("TEST FAILED: there are %d NativeMethodBind events\n\
-sent during non-start or non-live phase of the VM execution\n",
+ if (wrongBindEv != 0) {
+ NSK_COMPLAIN1(
+ "TEST FAILED: there are %d NativeMethodBind events\n"
+ "sent during non-start or non-live phase of the VM execution\n",
wrongBindEv);
+ }
if (result == STATUS_FAILED)
exit(95 + STATUS_FAILED);
--- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/NativeMethodBind/nativemethbind003/nativemethbind003.cpp Wed Sep 26 18:36:55 2018 +0100
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/NativeMethodBind/nativemethbind003/nativemethbind003.cpp Thu Sep 27 10:49:10 2018 -0700
@@ -124,14 +124,18 @@
if (bindEv[0] != bindEv[1]) {
result = STATUS_FAILED;
- NSK_COMPLAIN5("TEST FAILED: wrong NativeMethodBind events\n\
-\tfor tested method \"%s %s\" bound with \"%s\":\n\
-\tgot: %d\texpected: %d\n\n",
+ NSK_COMPLAIN5(
+ "TEST FAILED: wrong NativeMethodBind events\n"
+ "\tfor tested method \"%s %s\" bound with \"%s\":\n"
+ "\tgot: %d\texpected: %d\n\n",
METHODS[0], METHODS[1], CLASS_SIG, bindEv[0], bindEv[1]);
- } else
- NSK_DISPLAY4("CHECK PASSED: %d NativeMethodBind event(s)\n\
-\tfor tested method \"%s %s\" bound with \"%s\"\n\tas expected\n",
+ } else {
+ NSK_DISPLAY4(
+ "CHECK PASSED: %d NativeMethodBind event(s)\n"
+ "\tfor tested method \"%s %s\" bound with \"%s\"\n"
+ "\tas expected\n",
bindEv[0], METHODS[0], METHODS[1], CLASS_SIG);
+ }
if (result == STATUS_FAILED)
exit(95 + STATUS_FAILED);
@@ -151,8 +155,9 @@
jclass testedCls = NULL;
JNINativeMethod meth;
- NSK_DISPLAY1("Inside the registerNative()\n\
-Finding class \"%s\" ...\n", CLASS_SIG);
+ NSK_DISPLAY1("Inside the registerNative()\n"
+ "Finding class \"%s\" ...\n",
+ CLASS_SIG);
if (!NSK_JNI_VERIFY(env, (testedCls =
NSK_CPP_STUB2(FindClass, env, CLASS_SIG)) != NULL)) {
result = STATUS_FAILED;
@@ -165,8 +170,9 @@
meth.signature = (char*) METHODS[1];
meth.fnPtr = (void*) nativeMethod;
- NSK_DISPLAY3("Calling RegisterNatives() with \"%s %s\"\n\
-\tfor class \"%s\" ...\n",
+ NSK_DISPLAY3(
+ "Calling RegisterNatives() with \"%s %s\"\n"
+ "\tfor class \"%s\" ...\n",
METHODS[0], METHODS[1], CLASS_SIG);
if (!NSK_JNI_VERIFY_VOID(env, (NSK_CPP_STUB4(RegisterNatives,
env, testedCls, &meth, 1)) != 0)) {
--- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/NativeMethodBind/nativemethbind004/nativemethbind004.cpp Wed Sep 26 18:36:55 2018 +0100
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/NativeMethodBind/nativemethbind004/nativemethbind004.cpp Thu Sep 27 10:49:10 2018 -0700
@@ -138,22 +138,29 @@
Java_nsk_jvmti_NativeMethodBind_nativemethbind004_check(
JNIEnv *env, jobject obj) {
- if (origCalls == 0)
- NSK_DISPLAY0("CHECK PASSED: original nativeMethod() to be redirected\n\
-\thas not been invoked as expected\n");
- else {
+ if (origCalls == 0) {
+ NSK_DISPLAY0(
+ "CHECK PASSED: original nativeMethod() to be redirected\n"
+ "\thas not been invoked as expected\n");
+ } else {
result = STATUS_FAILED;
- NSK_COMPLAIN1("TEST FAILED: nativeMethod() has not been redirected by the NativeMethodBind:\n\
-\t%d calls\texpected: 0\n\n", origCalls);
+ NSK_COMPLAIN1(
+ "TEST FAILED: nativeMethod() has not been redirected by the NativeMethodBind:\n"
+ "\t%d calls\texpected: 0\n\n",
+ origCalls);
}
- if (redirCalls == 1)
- NSK_DISPLAY1("CHECK PASSED: nativeMethod() has been redirected by the NativeMethodBind:\n\
-\t%d calls of redirected method as expected\n", redirCalls);
- else {
+ if (redirCalls == 1) {
+ NSK_DISPLAY1(
+ "CHECK PASSED: nativeMethod() has been redirected by the NativeMethodBind:\n"
+ "\t%d calls of redirected method as expected\n",
+ redirCalls);
+ } else {
result = STATUS_FAILED;
- NSK_COMPLAIN1("TEST FAILED: nativeMethod() has not been redirected by the NativeMethodBind:\n\
-\t%d calls of redirected method\texpected: 1\n\n", redirCalls);
+ NSK_COMPLAIN1(
+ "TEST FAILED: nativeMethod() has not been redirected by the NativeMethodBind:\n"
+ "\t%d calls of redirected method\texpected: 1\n\n",
+ redirCalls);
}
return result;
--- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/ObjectFree/objfree001/objfree001.cpp Wed Sep 26 18:36:55 2018 +0100
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/ObjectFree/objfree001/objfree001.cpp Thu Sep 27 10:49:10 2018 -0700
@@ -165,8 +165,9 @@
else {
if (obtainedData != storedData) {
result = STATUS_FAILED;
- NSK_COMPLAIN3("TEST FAILED: %s: obtained an environment local storage has unexpected pointer:\n\
-got: 0x%p\texpected: 0x%p\n\n",
+ NSK_COMPLAIN3(
+ "TEST FAILED: %s: obtained an environment local storage has unexpected pointer:\n"
+ "got: 0x%p\texpected: 0x%p\n\n",
msg, (void*) obtainedData, (void*) storedData);
}
else
@@ -203,18 +204,23 @@
NSK_DISPLAY0("VMDeath event received\n");
if (clsUnloaded == JNI_TRUE) {
- if (objfree == 0)
- NSK_DISPLAY1("Warning: no ObjectFree events for a tagged object\n\
-\twhich class \"%s\" has been detected for unloading\n\n",
+ if (objfree == 0) {
+ NSK_DISPLAY1(
+ "Warning: no ObjectFree events for a tagged object\n"
+ "\twhich class \"%s\" has been detected for unloading\n\n",
CLASS_SIG);
- else
- NSK_DISPLAY2("CHECK PASSED: %d ObjectFree event(s) received for a tagged object\n\
-\twhich class \"%s\" has been detected for unloading\n\n",
+ } else {
+ NSK_DISPLAY2(
+ "CHECK PASSED: %d ObjectFree event(s) received for a tagged object\n"
+ "\twhich class \"%s\" has been detected for unloading\n\n",
objfree, CLASS_SIG);
- } else
- NSK_DISPLAY1("Warning: unloading of the tested class \"%s\" has not been detected,\n\
-\tso the test has no results\n",
- CLASS_SIG);
+ }
+ } else {
+ NSK_DISPLAY1(
+ "Warning: unloading of the tested class \"%s\" has not been detected,\n"
+ "\tso the test has no results\n",
+ CLASS_SIG);
+ }
if (result == STATUS_FAILED)
exit(95 + STATUS_FAILED);
--- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/ObjectFree/objfree002/objfree002.cpp Wed Sep 26 18:36:55 2018 +0100
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/ObjectFree/objfree002/objfree002.cpp Thu Sep 27 10:49:10 2018 -0700
@@ -198,8 +198,9 @@
else {
if (obtainedData != storedData) {
result = STATUS_FAILED;
- NSK_COMPLAIN3("TEST FAILED: %s: obtained an environment local storage has unexpected pointer:\n\
-got: 0x%p\texpected: 0x%p\n\n",
+ NSK_COMPLAIN3(
+ "TEST FAILED: %s: obtained an environment local storage has unexpected pointer:\n"
+ "got: 0x%p\texpected: 0x%p\n\n",
msg, (void*) obtainedData, (void*) storedData);
}
else
--- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/RedefineClasses/redefclass003/redefclass003.cpp Wed Sep 26 18:36:55 2018 +0100
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/RedefineClasses/redefclass003/redefclass003.cpp Thu Sep 27 10:49:10 2018 -0700
@@ -112,8 +112,8 @@
classDef.class_byte_count);
if ((err = (jvmti->RedefineClasses(1, &classDef))) != JVMTI_ERROR_NONE) {
if (err == JVMTI_ERROR_UNSUPPORTED_REDEFINITION_SCHEMA_CHANGED) {
- printf("Warning: unrestrictedly redefinition of classes is not implemented,\n\
-\tso the test has no results.\n");
+ printf("Warning: unrestrictedly redefinition of classes is not implemented,\n"
+ "\tso the test has no results.\n");
no_results = 1;
}
else {
@@ -157,9 +157,13 @@
printf("\tlongComplNewFld = %" LL "d, expected 44\n", longFld);
return STATUS_FAILED;
} else {
- if (vrb == 1)
- printf("Completely new static variables:\n\
-\tintComplNewFld = %d\n\tlongComplNewFld = %" LL "d\n", intFld, longFld);
+ if (vrb == 1) {
+ printf(
+ "Completely new static variables:\n"
+ "\tintComplNewFld = %d\n"
+ "\tlongComplNewFld = %" LL "d\n",
+ intFld, longFld);
+ }
return PASSED;
}
}
--- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/RedefineClasses/redefclass004/redefclass004.cpp Wed Sep 26 18:36:55 2018 +0100
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/RedefineClasses/redefclass004/redefclass004.cpp Thu Sep 27 10:49:10 2018 -0700
@@ -117,8 +117,9 @@
classDef.class_byte_count);
if ((err = (jvmti->RedefineClasses(1, &classDef))) != JVMTI_ERROR_NONE) {
if (err == JVMTI_ERROR_UNSUPPORTED_REDEFINITION_SCHEMA_CHANGED) {
- printf("Warning: unrestrictedly redefinition of classes is not implemented,\n\
-\tso the test has no results.\n");
+ printf(
+ "Warning: unrestrictedly redefinition of classes is not implemented,\n"
+ "\tso the test has no results.\n");
no_results = 1;
}
else {
@@ -182,11 +183,14 @@
env->ReleaseStringUTFChars(stringObj, strFld);
return STATUS_FAILED;
} else {
- if (vrb == 1)
- printf("Completely new fields:\n\
-\tstringComplNewFld = \"%s\"\n\tintComplNewFld = %d\n\
-\tlongComplNewFld = %" LL "d\n",
+ if (vrb == 1) {
+ printf(
+ "Completely new fields:\n"
+ "\tstringComplNewFld = \"%s\"\n"
+ "\tintComplNewFld = %d\n"
+ "\tlongComplNewFld = %" LL "d\n",
strFld, intFld, longFld);
+ }
env->ReleaseStringUTFChars(stringObj, strFld);
return PASSED;
}
--- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/RedefineClasses/redefclass008/redefclass008.cpp Wed Sep 26 18:36:55 2018 +0100
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/RedefineClasses/redefclass008/redefclass008.cpp Thu Sep 27 10:49:10 2018 -0700
@@ -141,8 +141,8 @@
breakpoints[i].mid = env->GetMethodID(
redefCls, breakpoints[i].m_name, breakpoints[i].m_sign);
if (breakpoints[i].mid == NULL) {
- printf("%s: Failed to get the method ID for the instance method\
- \"%s\" with signature \"%s\"\n",
+ printf(
+ "%s: Failed to get the method ID for the instance method \"%s\" with signature \"%s\"\n",
__FILE__, breakpoints[i].m_name, breakpoints[i].m_sign);
return STATUS_FAILED;
}
@@ -150,18 +150,22 @@
breakpoints[i].mid = env->GetStaticMethodID(
redefCls, breakpoints[i].m_name, breakpoints[i].m_sign);
if (breakpoints[i].mid == NULL) {
- printf("%s: Failed to get the method ID for the static method\
- \"%s\" with signature \"%s\"\n",
+ printf(
+ "%s: Failed to get the method ID for the static method \"%s\" with signature \"%s\"\n",
__FILE__, breakpoints[i].m_name, breakpoints[i].m_sign);
return STATUS_FAILED;
}
}
- if (vrb == 1)
- printf(">>>>>>>> #%d Invoke SetBreakpoint():\n\tbreakpoint in the %s\
- method: name=\"%s\"; signature=\"%s\"; location=%d\n",
+ if (vrb == 1) {
+ printf(
+ ">>>>>>>> #%d Invoke SetBreakpoint():\n"
+ "\tbreakpoint in the %s method: name=\"%s\"; "
+ "signature=\"%s\"; location=%d\n",
i, breakpoints[i].inst?"instance":"static",
breakpoints[i].m_name, breakpoints[i].m_sign, breakpoints[i].loc);
+ }
+
if ((err = (jvmti->SetBreakpoint(breakpoints[i].mid,
breakpoints[i].loc))) != JVMTI_ERROR_NONE) {
printf("%s: Failed to call SetBreakpoint(): error=%d: %s\n",
@@ -239,8 +243,9 @@
breakpoints[i].mid = env->GetMethodID(
redefCls, breakpoints[i].m_name, breakpoints[i].m_sign);
if (breakpoints[i].mid == NULL) {
- printf("%s: getResult: Failed to get the method ID for the instance method\
- \"%s\" with signature \"%s\"\n",
+ printf(
+ "%s: getResult: Failed to get the method ID for the instance method"
+ "\"%s\" with signature \"%s\"\n",
__FILE__, breakpoints[i].m_name, breakpoints[i].m_sign);
return STATUS_FAILED;
}
@@ -248,8 +253,9 @@
breakpoints[i].mid = env->GetStaticMethodID(
redefCls, breakpoints[i].m_name, breakpoints[i].m_sign);
if (breakpoints[i].mid == NULL) {
- printf("%s: getResult: Failed to get the method ID for the static method\
- \"%s\" with signature \"%s\"\n",
+ printf(
+ "%s: getResult: Failed to get the method ID for the static method"
+ "\"%s\" with signature \"%s\"\n",
__FILE__, breakpoints[i].m_name, breakpoints[i].m_sign);
return STATUS_FAILED;
}
@@ -257,25 +263,30 @@
if ((err = (jvmti->ClearBreakpoint(breakpoints[i].mid,
breakpoints[i].loc))) != JVMTI_ERROR_NOT_FOUND) {
- printf("TEST FAILED: Breakpoint #%d in the %s method:\n\
-\tname=\"%s\"; signature=\"%s\"; location=%d was not cleared:\n\
-\tClearBreakpoint() returned the error %d: %s\n\n",
+ printf(
+ "TEST FAILED: Breakpoint #%d in the %s method:\n"
+ "\tname=\"%s\"; signature=\"%s\"; location=%d was not cleared:\n"
+ "\tClearBreakpoint() returned the error %d: %s\n\n",
i, breakpoints[i].inst?"instance":"static",
breakpoints[i].m_name, breakpoints[i].m_sign,
breakpoints[i].loc, err, TranslateError(err));
totRes = STATUS_FAILED;
} else {
- if (vrb == 1)
- printf("Check #%d PASSED: Breakpoint in the %s method:\n\
-\tname=\"%s\"; signature=\"%s\"; location=%d was cleared:\n\
-\tClearBreakpoint() returned the error %d: %s\n\n",
+ if (vrb == 1) {
+ printf(
+ "Check #%d PASSED: Breakpoint in the %s method:\n"
+ "\tname=\"%s\"; signature=\"%s\"; location=%d was cleared:\n"
+ "\tClearBreakpoint() returned the error %d: %s\n\n",
i, breakpoints[i].inst?"instance":"static",
breakpoints[i].m_name, breakpoints[i].m_sign,
breakpoints[i].loc, err, TranslateError(err));
+ }
+
if ((err = (jvmti->SetBreakpoint(breakpoints[i].mid,
breakpoints[i].loc))) == JVMTI_ERROR_DUPLICATE) {
- printf("TEST FAILED: the function SetBreakpoint() returned the error %d: %s\n\
-\ti.e. the breakpoint #%d has not been really cleared.\n\n",
+ printf(
+ "TEST FAILED: the function SetBreakpoint() returned the error %d: %s\n"
+ "\ti.e. the breakpoint #%d has not been really cleared.\n\n",
err, TranslateError(err), i);
totRes = STATUS_FAILED;
}
--- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/RedefineClasses/redefclass009/redefclass009.cpp Wed Sep 26 18:36:55 2018 +0100
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/RedefineClasses/redefclass009/redefclass009.cpp Thu Sep 27 10:49:10 2018 -0700
@@ -174,8 +174,7 @@
methodsInfo[i].m_name, methodsInfo[i].m_sign);
}
if (methodsInfo[i].mid == NULL) {
- printf("%s: Failed to get the method ID for the%s%s method\
- \"%s\", signature \"%s\"\n",
+ printf("%s: Failed to get the method ID for the%s%s method \"%s\", signature \"%s\"\n",
__FILE__, full?" ":" original ", methodsInfo[i].inst?"instance":"static",
methodsInfo[i].m_name, methodsInfo[i].m_sign);
return STATUS_FAILED;
@@ -192,8 +191,9 @@
return STATUS_FAILED;
} else {
if (count != methodsInfo[i].vcount) {
- printf("TEST FAILED: %s%s method \"%s\", signature \"%s\":\
- found %d vars in the LocalVariableTable, expected %d\n",
+ printf(
+ "TEST FAILED: %s%s method \"%s\", signature \"%s\": "
+ "found %d vars in the LocalVariableTable, expected %d\n",
full?" ":" original ", methodsInfo[i].inst?"instance":"static",
methodsInfo[i].m_name, methodsInfo[i].m_sign,
count, methodsInfo[i].vcount);
@@ -201,8 +201,10 @@
continue;
}
else if (vrb)
- printf("\nChecking vars in the LocalVariableTable of the %s method \"%s\",\
- signature \"%s\" ...\n\tfound %d local vars as expected\n",
+ printf(
+ "\nChecking vars in the LocalVariableTable of the %s method \"%s\", "
+ "signature \"%s\" ...\n"
+ "\tfound %d local vars as expected\n",
methodsInfo[i].inst?"instance":"static",
methodsInfo[i].m_name, methodsInfo[i].m_sign, count);
@@ -211,8 +213,9 @@
for (k=0; k<count; k++) {
if (strcmp(lv_table[j].name, methodsInfo[i].vars[k].v_name) == 0) {
if (strcmp(lv_table[j].signature, methodsInfo[i].vars[k].v_sign) != 0) {
- printf("TEST FAILED: %s method \"%s\", signature \"%s\": var \"%s\"\
- has signature \"%s\" in the LocalVariableTable, expected \"%s\"\n",
+ printf(
+ "TEST FAILED: %s method \"%s\", signature \"%s\": var \"%s\" "
+ "has signature \"%s\" in the LocalVariableTable, expected \"%s\"\n",
methodsInfo[i].inst?"instance":"static",
methodsInfo[i].m_name, methodsInfo[i].m_sign,
lv_table[j].name, lv_table[j].signature,
--- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/RedefineClasses/redefclass010/redefclass010.cpp Wed Sep 26 18:36:55 2018 +0100
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/RedefineClasses/redefclass010/redefclass010.cpp Thu Sep 27 10:49:10 2018 -0700
@@ -152,8 +152,7 @@
methodsInfo[i].m_name, methodsInfo[i].m_sign);
}
if (methodsInfo[i].mid == NULL) {
- printf("%s: Failed to get the method ID for the%s%s method\
- \"%s\", signature \"%s\"\n",
+ printf("%s: Failed to get the method ID for the%s%s method \"%s\", signature \"%s\"\n",
__FILE__, (vrb==2)?" original ":" ", methodsInfo[i].inst?"instance":"static",
methodsInfo[i].m_name, methodsInfo[i].m_sign);
return STATUS_FAILED;
@@ -170,8 +169,8 @@
return STATUS_FAILED;
} else {
if (count != methodsInfo[i].lcount) {
- printf("TEST %s %s method \"%s\", signature \"%s\":\
- found %d lines in the LineNumberTable, expected %d\n",
+ printf(
+ "TEST %s %s method \"%s\", signature \"%s\": found %d lines in the LineNumberTable, expected %d\n",
(vrb==2)?"BUG: original ":"FAILED:",
methodsInfo[i].inst?"instance":"static",
methodsInfo[i].m_name, methodsInfo[i].m_sign,
@@ -180,8 +179,9 @@
continue;
}
else if (vrb == 1)
- printf("\nChecking line numbers in the LineNumberTable of the %s method\
- \"%s\", signature \"%s\" ...\n\toverall number of lines: %d as expected\n",
+ printf(
+ "\nChecking line numbers in the LineNumberTable of the %s method \"%s\", signature \"%s\" ...\n"
+ "\toverall number of lines: %d as expected\n",
methodsInfo[i].inst?"instance":"static",
methodsInfo[i].m_name, methodsInfo[i].m_sign, count);
@@ -192,8 +192,9 @@
chkval = redf_ln[i][j];
if (ln_table[j].line_number != chkval) {
- printf("TEST %s %s method \"%s\", signature \"%s\": entry #%d\
- has value %d in the LineNumberTable, expected %d\n",
+ printf(
+ "TEST %s %s method \"%s\", signature \"%s\": "
+ "entry #%d has value %d in the LineNumberTable, expected %d\n",
(vrb==2)?"BUG: original":"FAILED:",
methodsInfo[i].inst?"instance":"static",
methodsInfo[i].m_name, methodsInfo[i].m_sign,
--- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/SetJNIFunctionTable/setjniftab001/setjniftab001.cpp Wed Sep 26 18:36:55 2018 +0100
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/SetJNIFunctionTable/setjniftab001/setjniftab001.cpp Thu Sep 27 10:49:10 2018 -0700
@@ -351,11 +351,12 @@
if (verbose)
printf("\nb) Checking the assertion inside main thread detached and attached again ...\n\ndetaching the main thread ...\n");
- if ((res = vm->DetachCurrentThread()) != 0)
- printf("(%s,%d): Warning: DetachCurrentThread() returns: %d\n\
-\tcheck with the detached main thread skipped\n",
+ if ((res = vm->DetachCurrentThread()) != 0) {
+ printf(
+ "(%s,%d): Warning: DetachCurrentThread() returns: %d\n"
+ "\tcheck with the detached main thread skipped\n",
__FILE__, __LINE__, res);
- else {
+ } else {
if (verbose)
printf("\nattaching the main thread again ...\n");
if ((res = vm->AttachCurrentThread((void **) &nextEnv, (void *) 0)) != 0) {
--- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/SetJNIFunctionTable/setjniftab002/setjniftab002.cpp Wed Sep 26 18:36:55 2018 +0100
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/SetJNIFunctionTable/setjniftab002/setjniftab002.cpp Thu Sep 27 10:49:10 2018 -0700
@@ -78,11 +78,12 @@
only since JDK 1.2 */
if (verbose)
printf("\nb) Checking the function with the detached thread ...\n\ndetaching the main thread ...\n");
- if ((res = vm->DetachCurrentThread()) != JNI_OK)
- printf("(%s,%d): Warning: DetachCurrentThread() returns: %d\n\
-\tcheck with the detached main thread skipped\n",
+ if ((res = vm->DetachCurrentThread()) != JNI_OK) {
+ printf(
+ "(%s,%d): Warning: DetachCurrentThread() returns: %d\n"
+ "\tcheck with the detached main thread skipped\n",
__FILE__, __LINE__, res);
- else {
+ } else {
redirect(env, JVMTI_ERROR_UNATTACHED_THREAD);
if (verbose)
--- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/SingleStep/singlestep001/singlestep001.cpp Wed Sep 26 18:36:55 2018 +0100
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/SingleStep/singlestep001/singlestep001.cpp Thu Sep 27 10:49:10 2018 -0700
@@ -88,9 +88,10 @@
"failed to obtain a class signature\n");
if (sig != NULL && (strcmp(sig, CLASS_SIG) == 0)) {
- NSK_DISPLAY1("ClassLoad event received for the class \"%s\"\n\
-\tsetting breakpoint ...\n",
- sig);
+ NSK_DISPLAY1(
+ "ClassLoad event received for the class \"%s\"\n"
+ "\tsetting breakpoint ...\n",
+ sig);
setBP(jvmti_env, env, klass);
}
}
@@ -161,9 +162,11 @@
}
if (sig != NULL) {
- NSK_DISPLAY3("\tmethod name: \"%s\"\n\tsignature: \"%s\"\n\
-\tmethod declaring class: \"%s\"\n",
- methNam, methSig, sig);
+ NSK_DISPLAY3(
+ "\tmethod name: \"%s\"\n"
+ "\tsignature: \"%s\"\n"
+ "\tmethod declaring class: \"%s\"\n",
+ methNam, methSig, sig);
if (stepEv[1] == 1) {
result = STATUS_FAILED;
@@ -180,8 +183,9 @@
(strcmp(methSig,METHOD_SIGS[1]) == 0) &&
(strcmp(sig,CLASS_SIG) == 0)) {
stepEv[1]++;
- NSK_DISPLAY1("CHECK PASSED: SingleStep event received for the method \"%s\" as expected\n\
-\tdisabling the event generation\n",
+ NSK_DISPLAY1(
+ "CHECK PASSED: SingleStep event received for the method \"%s\" as expected\n"
+ "\tdisabling the event generation\n",
methNam);
if (!NSK_JVMTI_VERIFY(NSK_CPP_STUB4(SetEventNotificationMode,
jvmti_env, JVMTI_DISABLE, JVMTI_EVENT_SINGLE_STEP, thread))) {
--- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/SingleStep/singlestep002/singlestep002.cpp Wed Sep 26 18:36:55 2018 +0100
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/SingleStep/singlestep002/singlestep002.cpp Thu Sep 27 10:49:10 2018 -0700
@@ -69,10 +69,12 @@
VMDeath(jvmtiEnv *jvmti_env, JNIEnv *env) {
NSK_DISPLAY0("VMDeath event received\n");
- if (wrongStepEv != 0)
- NSK_COMPLAIN1("TEST FAILED: there are %d SingleStep events\n\
-sent during non-live phase of the VM execution\n",
+ if (wrongStepEv != 0) {
+ NSK_COMPLAIN1(
+ "TEST FAILED: there are %d SingleStep events\n"
+ "sent during non-live phase of the VM execution\n",
wrongStepEv);
+ }
if (result == STATUS_FAILED)
exit(95 + STATUS_FAILED);
--- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/SingleStep/singlestep003/singlestep003.cpp Wed Sep 26 18:36:55 2018 +0100
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/SingleStep/singlestep003/singlestep003.cpp Thu Sep 27 10:49:10 2018 -0700
@@ -86,10 +86,11 @@
"failed to obtain a class signature\n");
if (sig != NULL && (strcmp(sig, CLASS_SIG) == 0)) {
- NSK_DISPLAY1("ClassLoad event received for the class \"%s\"\n\
-\tsetting breakpoint ...\n",
- sig);
- setBP(jvmti_env, env, klass);
+ NSK_DISPLAY1(
+ "ClassLoad event received for the class \"%s\"\n"
+ "\tsetting breakpoint ...\n",
+ sig);
+ setBP(jvmti_env, env, klass);
}
}
@@ -169,15 +170,18 @@
(strcmp(sig,CLASS_SIG) == 0)) {
stepEv[i][0]++;
- if (stepEv[i][1] == 1)
- NSK_DISPLAY3("CHECK PASSED: SingleStep event received for the method:\n\
-\t \"%s %s\" of class \"%s\"\n\tas expected\n",
+ if (stepEv[i][1] == 1) {
+ NSK_DISPLAY3(
+ "CHECK PASSED: SingleStep event received for the method:\n"
+ "\t \"%s %s\" of class \"%s\"\n"
+ "\tas expected\n",
methNam, methSig, sig);
- else {
+ } else {
result = STATUS_FAILED;
- NSK_COMPLAIN3("TEST FAILED: SingleStep event received for the method:\n\
-\t \"%s %s\" of class \"%s\"\n",
- methNam, methSig, sig);
+ NSK_COMPLAIN3(
+ "TEST FAILED: SingleStep event received for the method:\n"
+ "\t \"%s %s\" of class \"%s\"\n",
+ methNam, methSig, sig);
}
if (i == (METH_NUM-1)) {
--- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/allocation/AP01/ap01t001/ap01t001.cpp Wed Sep 26 18:36:55 2018 +0100
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/allocation/AP01/ap01t001/ap01t001.cpp Thu Sep 27 10:49:10 2018 -0700
@@ -64,8 +64,10 @@
NSK_DISPLAY0("VMDeath event received\n");
if (obj_free != (EXP_OBJ_NUMBER - 1) ) {
- NSK_COMPLAIN2("Received unexpected number of ObjectFree events: %d\n\t\
-expected number: %d", obj_free, (EXP_OBJ_NUMBER - 1));
+ NSK_COMPLAIN2(
+ "Received unexpected number of ObjectFree events: %d\n"
+ "\texpected number: %d\n",
+ obj_free, (EXP_OBJ_NUMBER - 1));
exit(95 + STATUS_FAILED);
}
@@ -247,8 +249,11 @@
if (obj_count != EXP_OBJ_NUMBER) {
nsk_jvmti_setFailStatus();
- NSK_COMPLAIN2("IterateOverInstancesOfClass found unexpected number of objects: %d\n\t\
-expected number: %d\n\n", obj_count, EXP_OBJ_NUMBER);
+ NSK_COMPLAIN2(
+ "IterateOverInstancesOfClass found unexpected number of objects: %d\n"
+ "\texpected number: %d\n\n",
+ obj_count, EXP_OBJ_NUMBER);
+
} else {
NSK_DISPLAY1("Number of objects IterateOverInstancesOfClass has found: %d\n\n", obj_count);
}
@@ -267,8 +272,10 @@
if (obj_count != EXP_OBJ_NUMBER) {
nsk_jvmti_setFailStatus();
- NSK_COMPLAIN2("IterateOverHeap found unexpected number of objects: %d\n\t\
-expected number: %d\n\n", obj_count, EXP_OBJ_NUMBER);
+ NSK_COMPLAIN2(
+ "IterateOverHeap found unexpected number of objects: %d\n"
+ "\texpected number: %d\n\n",
+ obj_count, EXP_OBJ_NUMBER);
} else {
NSK_DISPLAY1("Number of objects IterateOverHeap has found: %d\n\n", obj_count);
}
@@ -287,8 +294,10 @@
if (obj_count != EXP_OBJ_NUMBER) {
nsk_jvmti_setFailStatus();
- NSK_COMPLAIN2("IterateOverReachableObjects found unexpected number of objects: %d\n\t\
-expected number: %d\n\n", obj_count, EXP_OBJ_NUMBER);
+ NSK_COMPLAIN2(
+ "IterateOverReachableObjects found unexpected number of objects: %d\n"
+ "\texpected number: %d\n\n",
+ obj_count, EXP_OBJ_NUMBER);
} else {
NSK_DISPLAY1("Number of objects IterateOverReachableObjects has found: %d\n\n", obj_count);
}
--- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/allocation/AP02/ap02t001/ap02t001.cpp Wed Sep 26 18:36:55 2018 +0100
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/allocation/AP02/ap02t001/ap02t001.cpp Thu Sep 27 10:49:10 2018 -0700
@@ -118,8 +118,10 @@
if (obj_count != exp_count) {
nsk_jvmti_setFailStatus();
- NSK_COMPLAIN3("IterateOverInstancesOfClass found unexpected number of %s objects: %d\n\t\
-expected number: %d\n\n", TESTED_CLASS, obj_count, exp_count);
+ NSK_COMPLAIN3(
+ "IterateOverInstancesOfClass found unexpected number of %s objects: %d\n"
+ "\texpected number: %d\n\n",
+ TESTED_CLASS, obj_count, exp_count);
} else {
NSK_DISPLAY2("Number of %s objects IterateOverInstancesOfClass has found: %d\n\n", TESTED_CLASS,
obj_count);
@@ -139,8 +141,10 @@
if (obj_count != exp_count) {
nsk_jvmti_setFailStatus();
- NSK_COMPLAIN3("IterateOverHeap found unexpected number of %s objects: %d\n\t\
-expected number: %d\n\n", TESTED_CLASS, obj_count, exp_count);
+ NSK_COMPLAIN3(
+ "IterateOverHeap found unexpected number of %s objects: %d\n"
+ "\texpected number: %d\n\n",
+ TESTED_CLASS, obj_count, exp_count);
} else {
NSK_DISPLAY2("Number of %s objects IterateOverHeap has found: %d\n\n", TESTED_CLASS, obj_count);
}
@@ -159,8 +163,10 @@
if (obj_count != exp_count) {
nsk_jvmti_setFailStatus();
- NSK_COMPLAIN3("IterateOverReachableObjects found unexpected number of %s objects: %d\n\t\
-expected number: %d\n\n", TESTED_CLASS, obj_count, exp_count);
+ NSK_COMPLAIN3(
+ "IterateOverReachableObjects found unexpected number of %s objects: %d\n"
+ "\texpected number: %d\n\n",
+ TESTED_CLASS, obj_count, exp_count);
} else {
NSK_DISPLAY2("Number of %s objects IterateOverReachableObjects has found: %d\n\n", TESTED_CLASS,
obj_count);
--- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/allocation/AP03/ap03t001/ap03t001.cpp Wed Sep 26 18:36:55 2018 +0100
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/allocation/AP03/ap03t001/ap03t001.cpp Thu Sep 27 10:49:10 2018 -0700
@@ -140,8 +140,10 @@
if (obj_count != EXP_OBJ_NUMBER) {
nsk_jvmti_setFailStatus();
- NSK_COMPLAIN2("IterateOverInstancesOfClass found unexpected number of objects: %d\n\t\
-expected number: %d\n\n", obj_count, EXP_OBJ_NUMBER);
+ NSK_COMPLAIN2(
+ "IterateOverInstancesOfClass found unexpected number of objects: %d\n"
+ "\texpected number: %d\n\n",
+ obj_count, EXP_OBJ_NUMBER);
} else {
NSK_DISPLAY1("Number of objects IterateOverInstancesOfClass has found: %d\n\n", obj_count);
}
@@ -160,8 +162,10 @@
if (obj_count != EXP_OBJ_NUMBER) {
nsk_jvmti_setFailStatus();
- NSK_COMPLAIN2("IterateOverHeap found unexpected number of objects: %d\n\t\
-expected number: %d\n\n", obj_count, EXP_OBJ_NUMBER);
+ NSK_COMPLAIN2(
+ "IterateOverHeap found unexpected number of objects: %d\n"
+ "\texpected number: %d\n\n",
+ obj_count, EXP_OBJ_NUMBER);
} else {
NSK_DISPLAY1("Number of objects IterateOverHeap has found: %d\n\n", obj_count);
}
@@ -197,8 +201,10 @@
if (obj_count != EXP_OBJ_NUMBER) {
nsk_jvmti_setFailStatus();
- NSK_COMPLAIN2("IterateOverObjectsReachableFromObject found unexpected number of objects: %d\n\t\
-expected number: %d\n\n", obj_count, EXP_OBJ_NUMBER);
+ NSK_COMPLAIN2(
+ "IterateOverObjectsReachableFromObject found unexpected number of objects: %d\n"
+ "\texpected number: %d\n\n",
+ obj_count, EXP_OBJ_NUMBER);
} else {
NSK_DISPLAY1("Number of objects IterateOverObjectsReachableFromObject has found: %d\n\n", obj_count);
}
--- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/allocation/AP10/ap10t001/ap10t001.cpp Wed Sep 26 18:36:55 2018 +0100
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/allocation/AP10/ap10t001/ap10t001.cpp Thu Sep 27 10:49:10 2018 -0700
@@ -81,8 +81,9 @@
else {
if (obtainedData != storedData) {
nsk_jvmti_setFailStatus();
- NSK_COMPLAIN3("%s: obtained an environment local storage has unexpected pointer:\n\
-got: 0x%p\texpected: 0x%p\n\n",
+ NSK_COMPLAIN3(
+ "%s: obtained an environment local storage has unexpected pointer:\n"
+ "got: 0x%p\texpected: 0x%p\n\n",
msg, (void*) obtainedData, (void*) storedData);
}
}
--- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/allocation/AP12/ap12t001/ap12t001.cpp Wed Sep 26 18:36:55 2018 +0100
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/allocation/AP12/ap12t001/ap12t001.cpp Thu Sep 27 10:49:10 2018 -0700
@@ -64,8 +64,10 @@
NSK_DISPLAY0("VMDeath event received\n");
if (obj_free != EXP_OBJ_FREE) {
- NSK_COMPLAIN2("Received unexpected number of ObjectFree events: %d\n\t\
-expected number: %d", obj_free, EXP_OBJ_FREE);
+ NSK_COMPLAIN2(
+ "Received unexpected number of ObjectFree events: %d\n"
+ "\texpected number: %d\n",
+ obj_free, EXP_OBJ_FREE);
exit(95 + STATUS_FAILED);
}
--- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/hotswap/HS201/hs201t003/hs201t003.cpp Wed Sep 26 18:36:55 2018 +0100
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/hotswap/HS201/hs201t003/hs201t003.cpp Thu Sep 27 10:49:10 2018 -0700
@@ -80,12 +80,12 @@
return 0;
}
- if ((strcmp(name, expMeth) == 0) &&
- (strcmp(sig, expSig) == 0)) {
- NSK_DISPLAY4("===== %s event received for the tested method:\n\
-\tID=0x%p name=\"%s\" signature=\"%s\"\n",
+ if ((strcmp(name, expMeth) == 0) && (strcmp(sig, expSig) == 0)) {
+ NSK_DISPLAY4(
+ "===== %s event received for the tested method:\n"
+ "\tID=0x%p name=\"%s\" signature=\"%s\"\n",
event, (void*) method, name, sig);
- methFound = 1;
+ methFound = 1;
}
else
methFound = 0;
@@ -129,8 +129,9 @@
classDef.class_byte_count = bytesCount;
classDef.class_bytes = (unsigned char*) clsBytes;
- NSK_DISPLAY2("[%s] >>>>> Invoke RedefineClasses():\n\
-\tnew class byte count=%d\n",
+ NSK_DISPLAY2(
+ "[%s] >>>>> Invoke RedefineClasses():\n"
+ "\tnew class byte count=%d\n",
event, classDef.class_byte_count);
if (!NSK_JVMTI_VERIFY(NSK_CPP_STUB3(RedefineClasses,
jvmti, 1, &classDef))) {
@@ -162,8 +163,9 @@
nsk_jvmti_setFailStatus();
return;
}
- NSK_DISPLAY3("[%s] method bytes count=%d\n\
-\tbytes count of the redefined method=%d\n",
+ NSK_DISPLAY3(
+ "[%s] method bytes count=%d\n"
+ "\tbytes count of the redefined method=%d\n",
event, methBytesCount, redefMethBytesCount);
if (!NSK_JVMTI_VERIFY(NSK_CPP_STUB2(Deallocate,
jvmti_env, (unsigned char*) methBytes)))
--- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/jni_interception/JI05/ji05t001/ji05t001.cpp Wed Sep 26 18:36:55 2018 +0100
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/jni_interception/JI05/ji05t001/ji05t001.cpp Thu Sep 27 10:49:10 2018 -0700
@@ -112,9 +112,10 @@
env->FatalError("failed to get redirected JNI function table");
}
- NSK_DISPLAY1("%s JVMTI env: doRedirect: the JNI function table obtained successfully\n\
-\toverwriting the function GetVersion() ...\n",
- (indx==0)?"first":"second");
+ NSK_DISPLAY1(
+ "%s JVMTI env: doRedirect: the JNI function table obtained successfully\n"
+ "\toverwriting the function GetVersion() ...\n",
+ (indx == 0) ? "first" : "second");
redir_jni_functions[indx]->GetVersion =
(indx==0)?MyGetVersionA:MyGetVersionB;
@@ -139,8 +140,9 @@
static int checkIntercept(int indx, int env_num, int exCalls) {
if (redir_calls[indx] == exCalls) {
- NSK_DISPLAY5("\nCHECK PASSED: GetVersion() interception set in the %s JVMTI env %s properly:\n\
-\t%d interception(s) with the%s%s JVMTI env as expected\n",
+ NSK_DISPLAY5(
+ "\nCHECK PASSED: GetVersion() interception set in the %s JVMTI env %s properly:\n"
+ "\t%d interception(s) with the%s%s JVMTI env as expected\n",
(indx==0)?"first":"second",
(exCalls==0)?"overwritten by another environment":"works",
redir_calls[indx],
@@ -149,8 +151,9 @@
}
else {
result = STATUS_FAILED;
- NSK_COMPLAIN6("\nTEST FAILED: GetVersion() interception set in the %s JVMTI env doesn't %s properly:\n\
-\t%d interception(s) with the%s%s JVMTI env instead of %d as expected\n",
+ NSK_COMPLAIN6(
+ "\nTEST FAILED: GetVersion() interception set in the %s JVMTI env doesn't %s properly:\n"
+ "\t%d interception(s) with the%s%s JVMTI env instead of %d as expected\n",
(indx==0)?"first":"second",
(exCalls==0)?"overwritten by another environment":"work",
redir_calls[indx],
@@ -259,8 +262,9 @@
/* intercept the JNI function table */
/* check the interception set in another JVMTI env */
- NSK_DISPLAY0("\n>>> TEST CASE #1) First JVMTI env: checking the redirection set in the same env ...\n\
-\nagent A (first JVMTI env): redirecting the function table ...\n");
+ NSK_DISPLAY0(
+ "\n>>> TEST CASE #1) First JVMTI env: checking the redirection set in the same env ...\n"
+ "\nagent A (first JVMTI env): redirecting the function table ...\n");
doRedirect(env, jvmti[0], 0);
/* check that the interception has been set properly */
@@ -343,8 +347,9 @@
NSK_DISPLAY0("\n<<< TEST CASE #2) done\n");
/* intercept the JNI function table */
- NSK_DISPLAY0("\n>>> TEST CASE #3) Second JVMTI env: checking the redirection set in the same env ...\n\
-\nagent B (second JVMTI env): redirecting the function table ...\n");
+ NSK_DISPLAY0(
+ "\n>>> TEST CASE #3) Second JVMTI env: checking the redirection set in the same env ...\n"
+ "\nagent B (second JVMTI env): redirecting the function table ...\n");
doRedirect(env, jvmti[1], 1);
for (i=0; i<AGENTS; i++) {
--- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/jni_interception/JI06/ji06t001/ji06t001.cpp Wed Sep 26 18:36:55 2018 +0100
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/jni_interception/JI06/ji06t001/ji06t001.cpp Thu Sep 27 10:49:10 2018 -0700
@@ -155,8 +155,8 @@
env->FatalError("failed to get redirected JNI function table");
}
- NSK_DISPLAY0("doRedirect: the JNI function table obtained successfully\n\
-\toverwriting the function MonitorEnter ...\n");
+ NSK_DISPLAY0("doRedirect: the JNI function table obtained successfully\n"
+ "\toverwriting the function MonitorEnter ...\n");
redir_jni_functions->MonitorEnter = MyMonitorEnter;
@@ -173,14 +173,16 @@
static void checkCall(int exMonEntCalls) {
if (monent_calls >= exMonEntCalls) {
- NSK_DISPLAY1("CHECK PASSED: the tested JNI function MonitorEnter() has been redirected:\n\
-\tat least %d intercepted call(s) as expected",
+ NSK_DISPLAY1(
+ "CHECK PASSED: the tested JNI function MonitorEnter() has been redirected:\n"
+ "\tat least %d intercepted call(s) as expected",
monent_calls);
}
else {
result = STATUS_FAILED;
- NSK_COMPLAIN2("TEST FAILED: the tested JNI function MonitorEnter() has not been redirected properly:\n\
-\tonly %d intercepted call(s) instead of at least %d as expected\n",
+ NSK_COMPLAIN2(
+ "TEST FAILED: the tested JNI function MonitorEnter() has not been redirected properly:\n"
+ "\tonly %d intercepted call(s) instead of at least %d as expected\n",
monent_calls, exMonEntCalls);
}
}
@@ -194,8 +196,9 @@
/* 4932877 fix in accordance with ANSI C: thread context of type void* -> int* -> int */
int indx = *((int *) context);
- NSK_DISPLAY1("waitingThread: thread #%d started\n\
-\tattaching the thread to the VM ...\n",
+ NSK_DISPLAY1(
+ "waitingThread: thread #%d started\n"
+ "\tattaching the thread to the VM ...\n",
indx);
if ((res = vm->AttachCurrentThread((void **) &env, (void *) 0)) != 0) {
NSK_COMPLAIN1("TEST FAILURE: waitingThread: AttachCurrentThread() returns: %d\n",
@@ -239,8 +242,9 @@
THREAD_return(STATUS_FAILED);
monEntered = 1; /* the monitor has been entered */
- NSK_DISPLAY1("ownerThread: entered the monitor: monEntered=%d\n\
-\twaiting ...\n",
+ NSK_DISPLAY1(
+ "ownerThread: entered the monitor: monEntered=%d\n"
+ "\twaiting ...\n",
monEntered);
do {
THREAD_sleep(1);
@@ -372,8 +376,8 @@
}
/* begin the testing */
- NSK_DISPLAY0(">>> TEST CASE a) Trying to redirect the JNI function ...\n\
-\nstarting redirector thread ...\n");
+ NSK_DISPLAY0(">>> TEST CASE a) Trying to redirect the JNI function ...\n\n"
+ "starting redirector thread ...\n");
redirThr = THREAD_new(redirectorThread, redirContext);
if (THREAD_start(redirThr) == NULL) {
NSK_COMPLAIN0("TEST FAILURE: cannot start redirector thread\n");
@@ -408,8 +412,8 @@
NSK_DISPLAY0("<<<\n\n");
/* verification of the interception */
- NSK_DISPLAY0(">>> TEST CASE b) Exercising the interception ...\n\
-\nmain thread: trying to enter the monitor ...\n");
+ NSK_DISPLAY0(">>> TEST CASE b) Exercising the interception ...\n\n"
+ "main thread: trying to enter the monitor ...\n");
if (enterMonitor(env, "mainThread") == STATUS_FAILED)
exitCode = STATUS_FAILED;
NSK_DISPLAY0("main thread: entered the monitor\n");
--- a/test/hotspot/jtreg/vmTestbase/nsk/share/JVMTIagent.cpp Wed Sep 26 18:36:55 2018 +0100
+++ b/test/hotspot/jtreg/vmTestbase/nsk/share/JVMTIagent.cpp Thu Sep 27 10:49:10 2018 -0700
@@ -167,12 +167,13 @@
else {
if (shortTestName != NULL) {
if (strstr((const char*) cls_sig, shortTestName) != NULL) {
- display(0, "#### JVMTIagent: found test class matched with \"%s\"\n\
-<JVMTIagent>\tsignature=%s\n",
- shortTestName, cls_sig);
+ display(0,
+ "#### JVMTIagent: found test class matched with \"%s\"\n"
+ "<JVMTIagent>\tsignature=%s\n",
+ shortTestName, cls_sig);
clsByteCount = allocClsInfo(jni_env, cls_sig, klass);
display(0, "#### JVMTIagent: %d bytes defining the class have been successfully loaded\n",
- clsByteCount);
+ clsByteCount);
}
}
}
@@ -534,33 +535,38 @@
return 0;
case HOTSWAP_EVERY_METHOD_ENTRY:
stress_lev = 2;
- display(0, "#### JVMTIagent: hotswapping class in every method entry event enabled ####\n\
-<JVMTIagent>\tHotSwap stress level: %d\n",
- stress_lev);
+ display(0,
+ "#### JVMTIagent: hotswapping class in every method entry event enabled ####\n"
+ "<JVMTIagent>\tHotSwap stress level: %d\n",
+ stress_lev);
break;
case HOTSWAP_EVERY_METHOD_ENTRY_FOR_EVERY_CLASS:
stress_lev = 2;
- display(0, "#### JVMTIagent: hotswapping class in every method entry event for every class enabled ####\n\
-<JVMTIagent>\tHotSwap stress level: %d\n",
- stress_lev);
+ display(0,
+ "#### JVMTIagent: hotswapping class in every method entry event for every class enabled ####\n"
+ "<JVMTIagent>\tHotSwap stress level: %d\n",
+ stress_lev);
break;
case HOTSWAP_EVERY_SINGLE_STEP:
stress_lev = 3;
- display(0, "#### JVMTIagent: hotswapping class in every single step event enabled ####\n\
-<JVMTIagent>\tHotSwap stress level: %d\n",
- stress_lev);
+ display(0,
+ "#### JVMTIagent: hotswapping class in every single step event enabled ####\n"
+ "<JVMTIagent>\tHotSwap stress level: %d\n",
+ stress_lev);
break;
case HOTSWAP_EVERY_EXCEPTION:
stress_lev = 4;
- display(0, "#### JVMTIagent: hotswapping class in every exception event enabled ####\n\
-<JVMTIagent>\tHotSwap stress level: %d\n",
- stress_lev);
+ display(0,
+ "#### JVMTIagent: hotswapping class in every exception event enabled ####\n"
+ "<JVMTIagent>\tHotSwap stress level: %d\n",
+ stress_lev);
break;
case HOTSWAP_EVERY_EXCEPTION_FOR_EVERY_CLASS:
stress_lev = 40;
- display(0, "#### JVMTIagent: hotswapping class in every exception event for every class enabled ####\n\
-<JVMTIagent>\tHotSwap stress level: %d\n",
- stress_lev);
+ display(0,
+ "#### JVMTIagent: hotswapping class in every exception event for every class enabled ####\n"
+ "<JVMTIagent>\tHotSwap stress level: %d\n",
+ stress_lev);
break;
default:
printf("ERROR(%s,%d): JVMTIagent: unknown value of HotSwap stress level: \"%d\"\n",
@@ -741,9 +747,10 @@
classDef.class_byte_count = bCount;
classDef.class_bytes = (unsigned char*) classBytes;
- display(0, "#### JVMTIagent: >>>>>>>> Invoke RedefineClasses():\n\
-<JVMTIagent>\tnew class byte count=%d\n",
- classDef.class_byte_count);
+ display(0,
+ "#### JVMTIagent: >>>>>>>> Invoke RedefineClasses():\n"
+ "<JVMTIagent>\tnew class byte count=%d\n",
+ classDef.class_byte_count);
if (!NSK_JVMTI_VERIFY(NSK_CPP_STUB3(RedefineClasses,
jvmti, 1, &classDef)))
return 1;
--- a/test/hotspot/jtreg/vmTestbase/nsk/share/aod/aod.cpp Wed Sep 26 18:36:55 2018 +0100
+++ b/test/hotspot/jtreg/vmTestbase/nsk/share/aod/aod.cpp Thu Sep 27 10:49:10 2018 -0700
@@ -236,16 +236,19 @@
jstring agentNameString;
if (!targetAppClass) {
- NSK_COMPLAIN1("%s: TEST LOGIC ERROR: method 'agentFinished' was called before "\
- "targetAppClass was initialized\n", agentName);
+ NSK_COMPLAIN1(
+ "%s: TEST LOGIC ERROR: method 'agentFinished' was called before "
+ "targetAppClass was initialized\n",
+ agentName);
return NSK_FALSE;
}
if (internalError && success) {
success = 0;
- NSK_COMPLAIN1("Status of agent '%s' is 'passed', but some error happened during test execution "\
- "(see log for details), change agent status to 'failed'\n",
- agentName);
+ NSK_COMPLAIN1(
+ "Status of agent '%s' is 'passed', but some error happened during test execution "
+ "(see log for details), change agent status to 'failed'\n",
+ agentName);
}
NSK_DISPLAY2("Agent %s finished (success: %d)\n", agentName, success);
--- a/test/jdk/ProblemList.txt Wed Sep 26 18:36:55 2018 +0100
+++ b/test/jdk/ProblemList.txt Thu Sep 27 10:49:10 2018 -0700
@@ -556,6 +556,9 @@
java/net/DatagramSocket/SendDatagramToBadAddress.java 7143960 macosx-all
+java/net/Socket/LingerTest.java 8208690 generic-all
+sun/net/www/http/HttpClient/MultiThreadTest.java 8208690 generic-all
+
############################################################################
# jdk_nio
--- a/test/jdk/TEST.groups Wed Sep 26 18:36:55 2018 +0100
+++ b/test/jdk/TEST.groups Thu Sep 27 10:49:10 2018 -0700
@@ -502,6 +502,7 @@
jdk/jfr/event/gc/collection/TestYoungGarbageCollectionEventWithG1New.java \
jdk/jfr/event/gc/collection/TestGCEventMixedWithG1FullCollection.java \
jdk/jfr/event/gc/collection/TestGCEventMixedWithG1ConcurrentMark.java \
+ jdk/jfr/event/gc/collection/TestG1ParallelPhases.java \
jdk/jfr/event/gc/objectcount/TestObjectCountAfterGCEventWithG1FullCollection.java \
jdk/jfr/event/gc/objectcount/TestObjectCountAfterGCEventWithG1ConcurrentMark.java \
jdk/jfr/event/gc/heapsummary/TestHeapSummaryEventG1.java
--- a/test/jdk/java/time/test/java/time/format/TestDateTimeFormatterBuilderWithLocale.java Wed Sep 26 18:36:55 2018 +0100
+++ b/test/jdk/java/time/test/java/time/format/TestDateTimeFormatterBuilderWithLocale.java Thu Sep 27 10:49:10 2018 -0700
@@ -74,9 +74,11 @@
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.time.format.FormatStyle;
+import java.time.format.ResolverStyle;
import java.time.LocalDate;
import java.time.temporal.ChronoField;
import java.time.temporal.Temporal;
+import java.time.temporal.TemporalAccessor;
import java.util.HashMap;
import java.util.Locale;
@@ -133,13 +135,22 @@
@Test(dataProvider="mapTextLookup")
public void test_appendText_mapTextLookup(ChronoLocalDate date, Locale locale) {
- final String new1st = "1st";
- Map<Long, String> yearMap = new HashMap<>();
- yearMap.put(1L, new1st);
- builder.appendText(ChronoField.YEAR_OF_ERA, yearMap);
+ final String firstYear = "firstYear";
+ final String firstMonth = "firstMonth";
+ final String firstYearMonth = firstYear + firstMonth;
+ final long first = 1L;
- String actual = date.format(builder.toFormatter(locale));
- assertEquals(actual, new1st);
+ DateTimeFormatter formatter = builder
+ .appendText(ChronoField.YEAR_OF_ERA, Map.of(first, firstYear))
+ .appendText(ChronoField.MONTH_OF_YEAR, Map.of(first, firstMonth))
+ .toFormatter(locale)
+ .withResolverStyle(ResolverStyle.STRICT);
+
+ assertEquals(date.format(formatter), firstYearMonth);
+
+ TemporalAccessor ta = formatter.parse(firstYearMonth);
+ assertEquals(ta.getLong(ChronoField.YEAR_OF_ERA), first);
+ assertEquals(ta.getLong(ChronoField.MONTH_OF_YEAR), first);
}
--- a/test/jdk/java/util/Locale/Bug7069824.java Wed Sep 26 18:36:55 2018 +0100
+++ b/test/jdk/java/util/Locale/Bug7069824.java Thu Sep 27 10:49:10 2018 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014, 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -23,906 +23,379 @@
/*
* @test
- * @bug 7069824 8042360 8032842 8175539
+ * @bug 7069824 8042360 8032842 8175539 8210443
* @summary Verify implementation for Locale matching.
- * @run main Bug7069824
+ * @run testng/othervm Bug7069824
*/
import java.util.*;
import java.util.Locale.*;
import static java.util.Locale.FilteringMode.*;
import static java.util.Locale.LanguageRange.*;
+import static org.testng.Assert.*;
+
+import org.testng.annotations.DataProvider;
+import org.testng.annotations.Test;
public class Bug7069824 {
- static boolean err = false;
+ @DataProvider(name = "LRConstructorData")
+ Object[][] LRConstructorData() {
+ return new Object[][] {
+ // Range, Weight
+ {"elvish", MAX_WEIGHT},
+ {"de-DE", MAX_WEIGHT},
+ {"de-Latn-DE-1996", MAX_WEIGHT},
+ {"zh-Hant-CN-x-private1-private2", MAX_WEIGHT},
+ {"ar", 0.8},
+ {"en-US", 0.5},
+ {"sr-Latn-BA", 0},
+ {"ja", 1},
+ };
+ }
- public static void main(String[] args) {
- testLanguageRange();
- testLocale();
+ @DataProvider(name = "LRConstructorNPEData")
+ Object[][] LRConstructorNPEData() {
+ return new Object[][] {
+ // Range, Weight
+ {null, MAX_WEIGHT},
+ {null, 0.8},
+ };
+ }
- if (err) {
- throw new RuntimeException("Failed.");
- }
+ @DataProvider(name = "LRConstructorIAEData")
+ Object[][] LRConstructorIAEData() {
+ return new Object[][] {
+ // Range, Weight
+ {"ja", -0.8},
+ {"Elvish", 3.0},
+ {"-ja", MAX_WEIGHT},
+ {"ja--JP", MAX_WEIGHT},
+ {"en-US-", MAX_WEIGHT},
+ {"a4r", MAX_WEIGHT},
+ {"ar*", MAX_WEIGHT},
+ {"ar-*EG", MAX_WEIGHT},
+ {"abcdefghijklmn", MAX_WEIGHT},
+ {"ja-J=", MAX_WEIGHT},
+ {"ja-opqrstuvwxyz", MAX_WEIGHT},
+ {"zh_CN", MAX_WEIGHT},
+ {"1996-de-Latn", MAX_WEIGHT},
+ // Testcase for 8042360
+ {"en-Latn-1234567890", MAX_WEIGHT},
+ };
}
- private static void testLanguageRange() {
- System.out.println("Test LanguageRange class...");
- testConstants();
- testConstructors();
- testMethods();
+ @DataProvider(name = "LRParseData")
+ Object[][] LRParseData() {
+ return new Object[][] {
+ // Ranges, Expected result
+ {"Accept-Language: fr-FX, de-DE;q=0.5, fr-tp-x-FOO;q=0.1, "
+ + "en-X-tp;q=0.6, en-FR;q=0.7, de-de;q=0.8, iw;q=0.4, "
+ + "he;q=0.4, de-de;q=0.5, ja, in-tpp, in-tp;q=0.2",
+ List.of(new LanguageRange("fr-fx", 1.0),
+ new LanguageRange("fr-fr", 1.0),
+ new LanguageRange("ja", 1.0),
+ new LanguageRange("in-tpp", 1.0),
+ new LanguageRange("id-tpp", 1.0),
+ new LanguageRange("en-fr", 0.7),
+ new LanguageRange("en-fx", 0.7),
+ new LanguageRange("en-x-tp", 0.6),
+ new LanguageRange("de-de", 0.5),
+ new LanguageRange("de-dd", 0.5),
+ new LanguageRange("iw", 0.4),
+ new LanguageRange("he", 0.4),
+ new LanguageRange("in-tp", 0.2),
+ new LanguageRange("id-tl", 0.2),
+ new LanguageRange("id-tp", 0.2),
+ new LanguageRange("in-tl", 0.2),
+ new LanguageRange("fr-tp-x-foo", 0.1),
+ new LanguageRange("fr-tl-x-foo", 0.1))},
+ {"Accept-Language: hak-CN;q=0.8, no-bok-NO;q=0.9, no-nyn, cmn-CN;q=0.1",
+ List.of(new LanguageRange("no-nyn", 1.0),
+ new LanguageRange("nn", 1.0),
+ new LanguageRange("no-bok-no", 0.9),
+ new LanguageRange("nb-no", 0.9),
+ new LanguageRange("hak-CN", 0.8),
+ new LanguageRange("zh-hakka-CN", 0.8),
+ new LanguageRange("i-hak-CN", 0.8),
+ new LanguageRange("cmn-CN", 0.1),
+ new LanguageRange("zh-cmn-CN", 0.1),
+ new LanguageRange("zh-guoyu-CN", 0.1))},
+ {"Accept-Language: rki;q=0.4, no-bok-NO;q=0.9, ccq;q=0.5",
+ List.of(new LanguageRange("no-bok-no", 0.9),
+ new LanguageRange("nb-no", 0.9),
+ new LanguageRange("rki", 0.4),
+ new LanguageRange("ybd", 0.4),
+ new LanguageRange("ccq", 0.4))},
+ };
+ }
+
+ @DataProvider(name = "LRParseIAEData")
+ Object[][] LRParseIAEData() {
+ return new Object[][] {
+ // Ranges
+ {""},
+ {"ja;q=3"},
+ };
}
- private static void testLocale() {
- System.out.println("Test Locale class...");
- test_filter();
- test_filterTags();
- test_lookup();
- test_lookupTag();
+ @DataProvider(name = "LRMapEquivalentsData")
+ Object[][] LRMapEquivalentsData() {
+ return new Object[][] {
+ // Ranges, Map, Expected result
+ {LanguageRange.parse("zh, zh-TW;q=0.8, ar;q=0.9, EN, zh-HK, ja-JP;q=0.2, es;q=0.4"),
+ new HashMap<>(),
+ LanguageRange.parse("zh, zh-TW;q=0.8, ar;q=0.9, EN, zh-HK, ja-JP;q=0.2, es;q=0.4")},
+ {LanguageRange.parse("zh, zh-TW;q=0.8, ar;q=0.9, EN, zh-HK, ja-JP;q=0.2, es;q=0.4"),
+ null,
+ LanguageRange.parse("zh, zh-TW;q=0.8, ar;q=0.9, EN, zh-HK, ja-JP;q=0.2, es;q=0.4")},
+ {LanguageRange.parse("zh, zh-TW;q=0.8, ar;q=0.9, EN, zh-HK, ja-JP;q=0.2, es;q=0.4"),
+ new LinkedHashMap<String, List<String>>() {
+ {
+ put("ja", List.of("ja", "ja-Hira"));
+ put("zh", List.of("zh-Hans", "zh-Hans-CN", "zh-CN"));
+ put("zh-TW", List.of("zh-TW", "zh-Hant"));
+ put("es", null);
+ put("en", List.of());
+ put("zh-HK", List.of("de"));
+ }
+ },
+ List.of(new LanguageRange("zh-hans", 1.0),
+ new LanguageRange("zh-hans-cn", 1.0),
+ new LanguageRange("zh-cn", 1.0),
+ new LanguageRange("de", 1.0),
+ new LanguageRange("ar", 0.9),
+ new LanguageRange("zh-tw", 0.8),
+ new LanguageRange("zh-hant", 0.8),
+ new LanguageRange("ja-jp", 0.2),
+ new LanguageRange("ja-hira-jp", 0.2))},
+ };
+ }
+
+ @DataProvider(name = "LFilterData")
+ Object[][] LFilterData() {
+ return new Object[][] {
+ // Range, LanguageTags, FilteringMode, Expected locales
+ {"ja-JP, fr-FR", "de-DE, en, ja-JP-hepburn, fr, he, ja-Latn-JP",
+ EXTENDED_FILTERING, "ja-JP-hepburn, ja-Latn-JP"},
+ {"ja-*-JP, fr-FR", "de-DE, en, ja-JP-hepburn, fr, he, ja-Latn-JP",
+ EXTENDED_FILTERING, "ja-JP-hepburn, ja-Latn-JP"},
+ {"ja-*-JP, fr-FR, de-de;q=0.2", "de-DE, en, ja-JP-hepburn, de-de, fr, he, ja-Latn-JP",
+ AUTOSELECT_FILTERING, "ja-JP-hepburn, ja-Latn-JP, de-DE"},
+ {"ja-JP, fr-FR, de-de;q=0.2", "de-DE, en, ja-JP-hepburn, de-de, fr, he, ja-Latn-JP",
+ AUTOSELECT_FILTERING, "ja-JP-hepburn, de-DE"},
+ {"en;q=0.2, ja-*-JP, fr-JP", "de-DE, en, ja-JP-hepburn, fr, he, ja-Latn-JP",
+ IGNORE_EXTENDED_RANGES, "en"},
+ {"en;q=0.2, ja-*-JP, fr-JP", "de-DE, en, ja-JP-hepburn, fr, he, ja-Latn-JP",
+ MAP_EXTENDED_RANGES, "ja-JP-hepburn, en"},
+ {"en;q=0.2, ja-JP, fr-JP", "de-DE, en, ja-JP-hepburn, fr, he, ja-Latn-JP",
+ REJECT_EXTENDED_RANGES, "ja-JP-hepburn, en"},
+ {"en;q=0.2, ja-*-JP, fr-JP", "", REJECT_EXTENDED_RANGES, ""},
+ };
+ }
+
+ @DataProvider(name = "LFilterNPEData")
+ Object[][] LFilterNPEData() {
+ return new Object[][] {
+ // Range, LanguageTags, FilteringMode
+ {"en;q=0.2, ja-*-JP, fr-JP", null, REJECT_EXTENDED_RANGES},
+ {null, "de-DE, en, ja-JP-hepburn, fr, he, ja-Latn-JP", REJECT_EXTENDED_RANGES},
+ };
}
- private static void testConstants() {
- boolean error = false;
+ @DataProvider(name = "LFilterTagsData")
+ Object[][] LFilterTagsData() {
+ return new Object[][] {
+ // Range, LanguageTags, FilteringMode, Expected language tags
+ {"en;q=0.2, *;q=0.6, ja", "de-DE, en, ja-JP-hepburn, fr-JP, he",
+ null, "de-DE, en, ja-JP-hepburn, fr-JP, he"},
+ {"en;q=0.2, ja-JP, fr-JP", "de-DE, en, ja-JP-hepburn, fr, he",
+ null, "ja-JP-hepburn, en"},
+ {"en;q=0.2, ja-JP, fr-JP, iw", "de-DE, he, en, ja-JP-hepburn, fr, he-IL",
+ null, "ja-JP-hepburn, he, he-IL, en"},
+ {"en;q=0.2, ja-JP, fr-JP, he", "de-DE, en, ja-JP-hepburn, fr, iw-IL",
+ null, "ja-JP-hepburn, iw-IL, en"},
+ {"de-DE", "de-DE, de-de, de-Latn-DE, de-Latf-DE, de-DE-x-goethe, "
+ + "de-Latn-DE-1996, de-Deva-DE, de, de-x-DE, de-Deva",
+ MAP_EXTENDED_RANGES, "de-DE, de-DE-x-goethe"},
+ {"de-DE", "de-DE, de-de, de-Latn-DE, de-Latf-DE, de-DE-x-goethe, "
+ + "de-Latn-DE-1996, de-Deva-DE, de, de-x-DE, de-Deva",
+ EXTENDED_FILTERING,
+ "de-DE, de-Latn-DE, de-Latf-DE, de-DE-x-goethe, "
+ + "de-Latn-DE-1996, de-Deva-DE"},
+ {"de-*-DE", "de-DE, de-de, de-Latn-DE, de-Latf-DE, de-DE-x-goethe, "
+ + "de-Latn-DE-1996, de-Deva-DE, de, de-x-DE, de-Deva",
+ EXTENDED_FILTERING,
+ "de-DE, de-Latn-DE, de-Latf-DE, de-DE-x-goethe, "
+ + "de-Latn-DE-1996, de-Deva-DE"},
+ };
+ }
- if (MIN_WEIGHT != 0.0) {
- error = true;
- System.err.println(" MIN_WEIGHT should be 0.0 but got "
- + MIN_WEIGHT);
- }
+ @DataProvider(name = "LLookupData")
+ Object[][] LLookupData() {
+ return new Object[][] {
+ // Range, LanguageTags, Expected locale
+ {"en;q=0.2, *-JP;q=0.6, iw", "de-DE, en, ja-JP-hepburn, fr-JP, he", "he"},
+ {"en;q=0.2, *-JP;q=0.6, iw", "de-DE, he-IL, en, iw", "he"},
+ {"en;q=0.2, ja-*-JP-x-foo;q=0.6, iw", "de-DE, fr, en, ja-Latn-JP", "ja-Latn-JP"},
+ };
+ }
- if (MAX_WEIGHT != 1.0) {
- error = true;
- System.err.println(" MAX_WEIGHT should be 1.0 but got "
+ @DataProvider(name = "LLookupTagData")
+ Object[][] LLookupTagData() {
+ return new Object[][] {
+ // Range, LanguageTags, Expected language tag
+ {"en, *", "es, de, ja-JP", null},
+ {"en;q=0.2, *-JP", "de-DE, en, ja-JP-hepburn, fr-JP, en-JP", "fr-JP"},
+ {"en;q=0.2, ar-MO, iw", "de-DE, he, fr-JP", "he"},
+ {"en;q=0.2, ar-MO, he", "de-DE, iw, fr-JP", "iw"},
+ {"de-DE-1996;q=0.8, en;q=0.2, iw;q=0.9, zh-Hans-CN;q=0.7", "de-DE, zh-CN, he, iw, fr-JP", "iw"},
+ {"de-DE-1996;q=0.8, en;q=0.2, he;q=0.9, zh-Hans-CN;q=0.7", "de-DE, zh-CN, he, iw, fr-JP", "he"},
+ };
+ }
+
+ @Test
+ public void testLRConstants() {
+ assertEquals(MIN_WEIGHT, 0.0, " MIN_WEIGHT should be 0.0 but got "
+ + MIN_WEIGHT);
+ assertEquals(MAX_WEIGHT, 1.0, " MAX_WEIGHT should be 1.0 but got "
+ MAX_WEIGHT);
- }
+ }
- if (error) {
- err = true;
- System.err.println(" testConstants() failed.");
+ @Test(dataProvider = "LRConstructorData")
+ public void testLRConstructors(String range, double weight) {
+ LanguageRange lr;
+ if (weight == MAX_WEIGHT) {
+ lr = new LanguageRange(range);
} else {
- System.out.println(" testConstants() passed.");
+ lr = new LanguageRange(range, weight);
+ }
+ assertEquals(lr.getRange(), range.toLowerCase(Locale.ROOT),
+ " LR.getRange() returned unexpected value. Expected: "
+ + range.toLowerCase(Locale.ROOT) + ", got: " + lr.getRange());
+ assertEquals(lr.getWeight(), weight,
+ " LR.getWeight() returned unexpected value. Expected: "
+ + weight + ", got: " + lr.getWeight());
+ }
+
+ @Test(dataProvider = "LRConstructorNPEData", expectedExceptions = NullPointerException.class)
+ public void testLRConstructorNPE(String range, double weight) {
+ if (weight == MAX_WEIGHT) {
+ new LanguageRange(range);
+ } else {
+ new LanguageRange(range, weight);
}
}
- private static void testConstructors() {
- boolean error = false;
-
- LanguageRange lr;
- String range;
- double weight;
-
- // Testcase for 8042360
- range = "en-Latn-1234567890";
- try {
- lr = new LanguageRange(range);
- error = true;
- System.err.println(" IAE should be thrown for LanguageRange("
- + range + ").");
- }
- catch (IllegalArgumentException ex) {
- }
-
- range = null;
- try {
- lr = new LanguageRange(range);
- error = true;
- System.err.println(" NPE should be thrown for LanguageRange("
- + range + ").");
- }
- catch (NullPointerException ex) {
- }
-
- range = null;
- weight = 0.8;
- try {
- lr = new LanguageRange(range, weight);
- error = true;
- System.err.println(" NPE should be thrown for LanguageRange("
- + range + ", " + weight + ").");
- }
- catch (NullPointerException ex) {
- }
-
- range = "elvish";
- try {
- lr = new LanguageRange(range);
- }
- catch (Exception ex) {
- error = true;
- System.err.println(" " + ex
- + " should not be thrown for LanguageRange(" + range + ").");
- }
-
- range = "de-DE";
- try {
- lr = new LanguageRange(range);
- }
- catch (Exception ex) {
- error = true;
- System.err.println(" " + ex
- + " should not be thrown for LanguageRange(" + range + ").");
- }
-
- range = "ar";
- weight = 0.8;
- try {
- lr = new LanguageRange(range, weight);
- }
- catch (Exception ex) {
- error = true;
- System.err.println(" " + ex
- + " should not be thrown for LanguageRange(" + range + ", "
- + weight + ").");
- }
-
- range = "ja";
- weight = -0.8;
- try {
- lr = new LanguageRange(range, weight);
- error = true;
- System.err.println(" IAE should be thrown for LanguageRange("
- + range + ", " + weight + ").");
- }
- catch (IllegalArgumentException ex) {
- }
-
- range = "Elvish";
- weight = 3.0;
- try {
- lr = new LanguageRange(range, weight);
- error = true;
- System.err.println(" IAE should be thrown for LanguageRange("
- + range + ", " + weight + ").");
- }
- catch (IllegalArgumentException ex) {
- }
-
- String[] illformedRanges = {"-ja", "ja--JP", "en-US-", "a4r", "ar*",
- "ar-*EG", "", "abcdefghijklmn", "ja-J=", "ja-opqrstuvwxyz"};
- for (String r : illformedRanges) {
- try {
- lr = new LanguageRange(r);
- error = true;
- System.err.println(" IAE should be thrown for LanguageRange("
- + r + ").");
- }
- catch (IllegalArgumentException ex) {
- }
- }
-
-
- if (error) {
- err = true;
- System.err.println(" testConstructors() failed.");
+ @Test(dataProvider = "LRConstructorIAEData", expectedExceptions = IllegalArgumentException.class)
+ public void testLRConstructorIAE(String range, double weight) {
+ if (weight == MAX_WEIGHT) {
+ new LanguageRange(range);
} else {
- System.out.println(" testConstructors() passed.");
+ new LanguageRange(range, weight);
}
}
- private static void testMethods() {
- test_getRange();
- test_getWeight();
- test_equals();
- test_parse();
- test_mapEquivalents();
- }
-
- private static void test_getRange() {
- boolean error = false;
-
- String range = "ja";
- double weight = 0.5;
- LanguageRange lr = new LanguageRange(range, weight);
- if (!lr.getRange().equals(range)) {
- error = true;
- System.err.println(" LanguageRange.getRange() returned unexpected value. Expected: "
- + range + ", got: " + lr.getRange());
- }
-
- range = "en-US";
- weight = 0.5;
- lr = new LanguageRange(range, weight);
- if (!lr.getRange().equals(range.toLowerCase())) {
- error = true;
- System.err.println(" LanguageRange.getRange() returned unexpected value. Expected: "
- + range + ", got: " + lr.getRange());
- }
-
- if (error) {
- err = true;
- System.err.println(" test_getRange() failed.");
- } else {
- System.out.println(" test_getRange() passed.");
- }
- }
-
- private static void test_getWeight() {
- boolean error = false;
-
- String range = "ja";
- double weight = 0.5;
- LanguageRange lr = new LanguageRange(range, weight);
- if (lr.getWeight() != weight) {
- error = true;
- System.err.println(" LanguageRange.getWeight() returned unexpected value. Expected: "
- + weight + ", got: " + lr.getWeight());
- }
-
- range = "ja";
- weight = MAX_WEIGHT; // default
- lr = new LanguageRange(range);
- if (!lr.getRange().equals(range) || lr.getWeight() != MAX_WEIGHT) {
- error = true;
- System.err.println(" LanguageRange.getWeight() returned unexpected value. Expected: "
- + weight + ", got: " + lr.getWeight());
- }
-
- if (error) {
- err = true;
- System.err.println(" test_getWeight() failed.");
- } else {
- System.out.println(" test_getWeight() passed.");
- }
- }
-
- private static void test_equals() {
- boolean error = false;
-
+ @Test
+ public void testLREquals() {
LanguageRange lr1 = new LanguageRange("ja", 1.0);
LanguageRange lr2 = new LanguageRange("ja");
LanguageRange lr3 = new LanguageRange("ja", 0.1);
LanguageRange lr4 = new LanguageRange("en", 1.0);
- if (!lr1.equals(lr2)) {
- error = true;
- System.err.println(" LanguageRange(LR(ja, 1.0)).equals(LR(ja)) should return true.");
- }
-
- if (lr1.equals(lr3)) {
- error = true;
- System.err.println(" LanguageRange(LR(ja, 1.0)).equals(LR(ja, 0.1)) should return false.");
- }
-
- if (lr1.equals(lr4)) {
- error = true;
- System.err.println(" LanguageRange(LR(ja, 1.0)).equals(LR(en, 1.0)) should return false.");
- }
+ assertEquals(lr1, lr2, " LR(ja, 1.0).equals(LR(ja)) should return true.");
+ assertNotEquals(lr1, lr3, " LR(ja, 1.0).equals(LR(ja, 0.1)) should return false.");
+ assertNotEquals(lr1, lr4, " LR(ja, 1.0).equals(LR(en, 1.0)) should return false.");
+ assertNotNull(lr1, " LR(ja, 1.0).equals(null) should return false.");
+ assertNotEquals(lr1, "", " LR(ja, 1.0).equals(\"\") should return false.");
+ }
- if (lr1.equals(null)) {
- error = true;
- System.err.println(" LanguageRange(LR(ja, 1.0)).equals(null) should return false.");
- }
-
- if (lr1.equals("")) {
- error = true;
- System.err.println(" LanguageRange(LR(ja, 1.0)).equals(\"\") should return false.");
+ @Test(dataProvider = "LRParseData")
+ public void testLRParse(String ranges, List<LanguageRange> expected) {
+ assertEquals(LanguageRange.parse(ranges), expected,
+ " LR.parse(" + ranges + ") test failed.");
+ }
- }
-
- if (error) {
- err = true;
- System.err.println(" test_equals() failed.");
- } else {
- System.out.println(" test_equals() passed.");
- }
+ @Test(expectedExceptions = NullPointerException.class)
+ public void testLRParseNPE() {
+ LanguageRange.parse(null);
}
- private static void test_parse() {
- boolean error = false;
-
- List<LanguageRange> list;
- String str = null;
- try {
- list = LanguageRange.parse(str);
- error = true;
- System.err.println(" NPE should be thrown for parse("
- + str + ").");
- }
- catch (NullPointerException ex) {
- }
-
- str = "";
- try {
- list = LanguageRange.parse("");
- error = true;
- System.err.println(" IAE should be thrown for parse("
- + str + ").");
- }
- catch (IllegalArgumentException ex) {
- }
-
- str = "ja;q=3";
- try {
- list = LanguageRange.parse(str);
- error = true;
- System.err.println("IAE should be thrown for parse("
- + str + ").");
- }
- catch (IllegalArgumentException ex) {
- }
-
- str = "Accept-Language: fr-FX,de-DE;q=0.5, fr-tp-x-FOO;q=0.1,"
- + "en-X-tp;q=0.6,en-FR;q=.7,de-de;q=0.8, iw;q=0.4, "
- + "he;q=0.4, de-de;q=0.5,ja, in-tpp, in-tp;q=0.2";
- ArrayList<LanguageRange> expected = new ArrayList<>();
- expected.add(new LanguageRange("fr-fx", 1.0));
- expected.add(new LanguageRange("fr-fr", 1.0));
- expected.add(new LanguageRange("ja", 1.0));
- expected.add(new LanguageRange("in-tpp", 1.0));
- expected.add(new LanguageRange("id-tpp", 1.0));
- expected.add(new LanguageRange("en-fr", 0.7));
- expected.add(new LanguageRange("en-fx", 0.7));
- expected.add(new LanguageRange("en-x-tp", 0.6));
- expected.add(new LanguageRange("de-de", 0.5));
- expected.add(new LanguageRange("de-dd", 0.5));
- expected.add(new LanguageRange("iw", 0.4));
- expected.add(new LanguageRange("he", 0.4));
- expected.add(new LanguageRange("in-tp", 0.2));
- expected.add(new LanguageRange("id-tl", 0.2));
- expected.add(new LanguageRange("id-tp", 0.2));
- expected.add(new LanguageRange("in-tl", 0.2));
- expected.add(new LanguageRange("fr-tp-x-foo", 0.1));
- expected.add(new LanguageRange("fr-tl-x-foo", 0.1));
- List<LanguageRange> got = LanguageRange.parse(str);
- if (!areEqual(expected, got)) {
- error = true;
- System.err.println(" #1 parse() test failed.");
- }
-
- str = "Accept-Language: hak-CN;q=0.8, no-bok-NO;q=0.9, no-nyn, cmn-CN;q=0.1";
- expected = new ArrayList<>();
- expected.add(new LanguageRange("no-nyn", 1.0));
- expected.add(new LanguageRange("nn", 1.0));
- expected.add(new LanguageRange("no-bok-no", 0.9));
- expected.add(new LanguageRange("nb-no", 0.9));
- expected.add(new LanguageRange("hak-CN", 0.8));
- expected.add(new LanguageRange("zh-hakka-CN", 0.8));
- expected.add(new LanguageRange("i-hak-CN", 0.8));
- expected.add(new LanguageRange("cmn-CN", 0.1));
- expected.add(new LanguageRange("zh-cmn-CN", 0.1));
- expected.add(new LanguageRange("zh-guoyu-CN", 0.1));
- got = LanguageRange.parse(str);
- if (!areEqual(expected, got)) {
- error = true;
- System.err.println(" #2 parse() test failed.");
- }
-
- str = "Accept-Language: rki;q=0.4, no-bok-NO;q=0.9, ccq;q=0.5";
- expected = new ArrayList<>();
- expected.add(new LanguageRange("no-bok-no", 0.9));
- expected.add(new LanguageRange("nb-no", 0.9));
- expected.add(new LanguageRange("rki", 0.4));
- expected.add(new LanguageRange("ybd", 0.4));
- expected.add(new LanguageRange("ccq", 0.4));
- got = LanguageRange.parse(str);
- if (!areEqual(expected, got)) {
- error = true;
- System.err.println(" #3 parse() test failed.");
- }
-
- if (error) {
- err = true;
- System.err.println(" test_parse() failed.");
- } else {
- System.out.println(" test_parse() passed.");
- }
+ @Test(dataProvider = "LRParseIAEData", expectedExceptions = IllegalArgumentException.class)
+ public void testLRParseIAE(String ranges) {
+ LanguageRange.parse(ranges);
}
- private static boolean areEqual(List<LanguageRange> expected,
- List<LanguageRange> got) {
- boolean error = false;
-
- int expectedSize = expected.size();
- int actualSize = got.size();
-
- if (expectedSize != actualSize) {
- error = true;
-
- System.err.println(" Expected size=" + expectedSize);
- for (LanguageRange lr : expected) {
- System.err.println(" range=" + lr.getRange()
- + ", weight=" + lr.getWeight());
- }
-
- System.out.println(" Actual size=" + actualSize);
- for (LanguageRange lr : got) {
- System.err.println(" range=" + lr.getRange()
- + ", weight=" + lr.getWeight());
- }
- } else {
- for (int i = 0; i < expectedSize; i++) {
- LanguageRange lr1 = expected.get(i);
- LanguageRange lr2 = got.get(i);
-
- if (!lr1.getRange().equals(lr2.getRange())
- || lr1.getWeight() != lr2.getWeight()) {
- error = true;
- System.err.println(" " + i + ": Expected: range=" + lr1.getRange()
- + ", weight=" + lr1.getWeight());
- System.err.println(" " + i + ": Actual: range=" + lr2.getRange()
- + ", weight=" + lr2.getWeight());
- }
- }
- }
-
- return !error;
+ @Test(dataProvider = "LRMapEquivalentsData")
+ public void testLRMapEquivalents(List<Locale.LanguageRange> priorityList,
+ Map<String,List<String>> map, List<LanguageRange> expected) {
+ assertEquals(LanguageRange.mapEquivalents(priorityList, map), expected,
+ " LR.mapEquivalents() test failed.");
}
- private static void test_mapEquivalents() {
- boolean error = false;
-
- String ranges = "zh, zh-TW;q=0.8, ar;q=0.9, EN, zh-HK, ja-JP;q=0.2, es;q=0.4";
- List<LanguageRange> priorityList = LanguageRange.parse(ranges);
- HashMap<String, List<String>> map = null;
-
- try {
- List<LanguageRange> list =
- LanguageRange.mapEquivalents(priorityList, null);
- }
- catch (Exception ex) {
- error = true;
- System.err.println(ex
- + " should not be thrown for mapEquivalents(priorityList, null).");
- }
-
- map = new HashMap<>();
- try {
- List<LanguageRange> list =
- LanguageRange.mapEquivalents(priorityList, map);
- }
- catch (Exception ex) {
- error = true;
- System.err.println(ex
- + " should not be thrown for mapEquivalents(priorityList, empty map).");
- }
-
- ArrayList<String> equivalentList = new ArrayList<>();
- equivalentList.add("ja");
- equivalentList.add("ja-Hira");
- map.put("ja", equivalentList);
- try {
- List<LanguageRange> list = LanguageRange.mapEquivalents(null, map);
- error = true;
- System.err.println("NPE should be thrown for mapEquivalents(null, map).");
- }
- catch (NullPointerException ex) {
- }
-
- map = new LinkedHashMap<>();
- ArrayList<String> equivalentList1 = new ArrayList<>();
- equivalentList1.add("ja");
- equivalentList1.add("ja-Hira");
- map.put("ja", equivalentList1);
- ArrayList<String> equivalentList2 = new ArrayList<>();
- equivalentList2.add("zh-Hans");
- equivalentList2.add("zh-Hans-CN");
- equivalentList2.add("zh-CN");
- map.put("zh", equivalentList2);
- ArrayList<String> equivalentList3 = new ArrayList<>();
- equivalentList3.add("zh-TW");
- equivalentList3.add("zh-Hant");
- map.put("zh-TW", equivalentList3);
- map.put("es", null);
- ArrayList<String> equivalentList4 = new ArrayList<>();
- map.put("en", equivalentList4);
- ArrayList<String> equivalentList5 = new ArrayList<>();
- equivalentList5.add("de");
- map.put("zh-HK", equivalentList5);
-
- ArrayList<LanguageRange> expected = new ArrayList<>();
- expected.add(new LanguageRange("zh-hans", 1.0));
- expected.add(new LanguageRange("zh-hans-cn", 1.0));
- expected.add(new LanguageRange("zh-cn", 1.0));
- expected.add(new LanguageRange("de", 1.0));
- expected.add(new LanguageRange("ar", 0.9));
- expected.add(new LanguageRange("zh-tw", 0.8));
- expected.add(new LanguageRange("zh-hant", 0.8));
- expected.add(new LanguageRange("ja-jp", 0.2));
- expected.add(new LanguageRange("ja-hira-jp", 0.2));
- List<LanguageRange> got =
- LanguageRange.mapEquivalents(priorityList, map);
-
- if (!areEqual(expected, got)) {
- error = true;
- }
-
- if (error) {
- err = true;
- System.err.println(" test_mapEquivalents() failed.");
- } else {
- System.out.println(" test_mapEquivalents() passed.");
- }
+ @Test(expectedExceptions = NullPointerException.class)
+ public void testLRMapEquivalentsNPE() {
+ LanguageRange.mapEquivalents(null, Map.of("ja", List.of("ja", "ja-Hira")));
}
- private static void test_filter() {
- boolean error = false;
-
- String ranges = "ja-JP, fr-FR";
- String tags = "de-DE, en, ja-JP-hepburn, fr, he, ja-Latn-JP";
- FilteringMode mode = EXTENDED_FILTERING;
-
+ @Test(dataProvider = "LFilterData")
+ public void testLFilter(String ranges, String tags, FilteringMode mode, String expectedLocales) {
List<LanguageRange> priorityList = LanguageRange.parse(ranges);
List<Locale> tagList = generateLocales(tags);
String actualLocales =
- showLocales(Locale.filter(priorityList, tagList, mode));
- String expectedLocales = "ja-JP-hepburn, ja-Latn-JP";
-
- if (!expectedLocales.equals(actualLocales)) {
- error = true;
- showErrorMessage("#1 filter(" + mode + ")",
- ranges, tags, expectedLocales, actualLocales);
- }
-
-
- ranges = "ja-*-JP, fr-FR";
- tags = "de-DE, en, ja-JP-hepburn, fr, he, ja-Latn-JP";
- mode = EXTENDED_FILTERING;
-
- priorityList = LanguageRange.parse(ranges);
- tagList = generateLocales(tags);
- actualLocales = showLocales(Locale.filter(priorityList, tagList, mode));
- expectedLocales = "ja-JP-hepburn, ja-Latn-JP";
-
- if (!expectedLocales.equals(actualLocales)) {
- error = true;
- showErrorMessage("#2 filter(" + mode + ")",
- ranges, tags, expectedLocales, actualLocales);
- }
-
-
- ranges = "ja-*-JP, fr-FR, de-de;q=0.2";
- tags = "de-DE, en, ja-JP-hepburn, de-de, fr, he, ja-Latn-JP";
- mode = AUTOSELECT_FILTERING;
-
- priorityList = LanguageRange.parse(ranges);
- tagList = generateLocales(tags);
- actualLocales = showLocales(Locale.filter(priorityList, tagList, mode));
- expectedLocales = "ja-JP-hepburn, ja-Latn-JP, de-DE";
-
- if (!expectedLocales.equals(actualLocales)) {
- error = true;
- showErrorMessage("#3 filter(" + mode + ")",
- ranges, tags,expectedLocales, actualLocales);
- }
-
- ranges = "ja-JP, fr-FR, de-de;q=0.2";
- tags = "de-DE, en, ja-JP-hepburn, de-de, fr, he, ja-Latn-JP";
- mode = AUTOSELECT_FILTERING;
-
- priorityList = LanguageRange.parse(ranges);
- tagList = generateLocales(tags);
- actualLocales = showLocales(Locale.filter(priorityList, tagList, mode));
- expectedLocales = "ja-JP-hepburn, de-DE";
-
- if (!expectedLocales.equals(actualLocales)) {
- error = true;
- showErrorMessage("#4 filter(" + mode + ")",
- ranges, tags, expectedLocales, actualLocales);
- }
-
-
- ranges = "en;q=0.2, ja-*-JP, fr-JP";
- tags = "de-DE, en, ja-JP-hepburn, fr, he, ja-Latn-JP";
- mode = IGNORE_EXTENDED_RANGES;
-
- priorityList = LanguageRange.parse(ranges);
- tagList = generateLocales(tags);
- actualLocales = showLocales(Locale.filter(priorityList, tagList, mode));
- expectedLocales = "en";
-
- if (!expectedLocales.equals(actualLocales)) {
- error = true;
- showErrorMessage("#5 filter(" + mode + ")",
- ranges, tags, expectedLocales, actualLocales);
- }
-
-
- ranges = "en;q=0.2, ja-*-JP, fr-JP";
- tags = "de-DE, en, ja-JP-hepburn, fr, he, ja-Latn-JP";
- mode = MAP_EXTENDED_RANGES;
-
- priorityList = LanguageRange.parse(ranges);
- tagList = generateLocales(tags);
- actualLocales = showLocales(Locale.filter(priorityList, tagList, mode));
- expectedLocales = "ja-JP-hepburn, en";
-
- if (!expectedLocales.equals(actualLocales)) {
- error = true;
- showErrorMessage("#6 filter(" + mode + ")",
- ranges, tags, expectedLocales, actualLocales);
- }
-
+ showLocales(Locale.filter(priorityList, tagList, mode));
+ assertEquals(actualLocales, expectedLocales, showErrorMessage(" L.Filter(" + mode + ")",
+ ranges, tags, expectedLocales, actualLocales));
+ }
- ranges = "en;q=0.2, ja-JP, fr-JP";
- tags = "de-DE, en, ja-JP-hepburn, fr, he, ja-Latn-JP";
- mode = REJECT_EXTENDED_RANGES;
-
- priorityList = LanguageRange.parse(ranges);
- tagList = generateLocales(tags);
- actualLocales = showLocales(Locale.filter(priorityList, tagList, mode));
- expectedLocales = "ja-JP-hepburn, en";
-
- if (!expectedLocales.equals(actualLocales)) {
- error = true;
- showErrorMessage("#7 filter(" + mode + ")",
- ranges, tags, expectedLocales, actualLocales);
- }
-
-
- ranges = "en;q=0.2, ja-*-JP, fr-JP";
- tags = "de-DE, en, ja-JP-hepburn, fr, he, ja-Latn-JP";
- mode = REJECT_EXTENDED_RANGES;
-
- priorityList = LanguageRange.parse(ranges);
- tagList = generateLocales(tags);
- try {
- actualLocales =
- showLocales(Locale.filter(priorityList, tagList, mode));
- error = true;
- System.out.println("IAE should be thrown for filter("
- + mode + ").");
- }
- catch (IllegalArgumentException ex) {
- }
-
-
- ranges = "en;q=0.2, ja-*-JP, fr-JP";
- tags = null;
- mode = REJECT_EXTENDED_RANGES;
-
- priorityList = LanguageRange.parse(ranges);
- tagList = generateLocales(tags);
- try {
- actualLocales =
- showLocales(Locale.filter(priorityList, tagList, mode));
- error = true;
- System.out.println("NPE should be thrown for filter(tags=null).");
- }
- catch (NullPointerException ex) {
- }
-
-
- ranges = null;
- tags = "de-DE, en, ja-JP-hepburn, fr, he, ja-Latn-JP";
- mode = REJECT_EXTENDED_RANGES;
-
- try {
- priorityList = LanguageRange.parse(ranges);
- tagList = generateLocales(tags);
- actualLocales =
- showLocales(Locale.filter(priorityList, tagList, mode));
- error = true;
- System.out.println("NPE should be thrown for filter(ranges=null).");
- }
- catch (NullPointerException ex) {
- }
-
-
- ranges = "en;q=0.2, ja-*-JP, fr-JP";
- tags = "";
- mode = REJECT_EXTENDED_RANGES;
-
- priorityList = LanguageRange.parse(ranges);
- tagList = generateLocales(tags);
- try {
- actualLocales =
- showLocales(Locale.filter(priorityList, tagList, mode));
- }
- catch (Exception ex) {
- error = true;
- System.out.println(ex
- + " should not be thrown for filter(" + ranges + ", \"\").");
- }
-
-
- if (error) {
- err = true;
- System.out.println(" test_filter() failed.");
- } else {
- System.out.println(" test_filter() passed.");
- }
+ @Test(dataProvider = "LFilterNPEData", expectedExceptions = NullPointerException.class)
+ public void testLFilterNPE(String ranges, String tags, FilteringMode mode) {
+ List<LanguageRange> priorityList = LanguageRange.parse(ranges);
+ List<Locale> tagList = generateLocales(tags);
+ showLocales(Locale.filter(priorityList, tagList, mode));
}
- private static void test_filterTags() {
- boolean error = false;
+ @Test(expectedExceptions = IllegalArgumentException.class)
+ public void testLFilterIAE() {
+ String ranges = "en;q=0.2, ja-*-JP, fr-JP";
+ String tags = "de-DE, en, ja-JP-hepburn, fr, he, ja-Latn-JP";
+ List<LanguageRange> priorityList = LanguageRange.parse(ranges);
+ List<Locale> tagList = generateLocales(tags);
+ showLocales(Locale.filter(priorityList, tagList, REJECT_EXTENDED_RANGES));
+ }
- String ranges = "en;q=0.2, *;q=0.6, ja";
- String tags = "de-DE, en, ja-JP-hepburn, fr-JP, he";
-
+ @Test(dataProvider = "LFilterTagsData")
+ public void testLFilterTags(String ranges, String tags, FilteringMode mode, String expectedTags) {
List<LanguageRange> priorityList = LanguageRange.parse(ranges);
List<String> tagList = generateLanguageTags(tags);
- String actualTags =
- showLanguageTags(Locale.filterTags(priorityList, tagList));
- String expectedTags = tags;
-
- if (!expectedTags.equals(actualTags)) {
- error = true;
- showErrorMessage("#1 filterTags()",
- ranges, tags, expectedTags, actualTags);
- }
-
-
- ranges = "en;q=0.2, ja-JP, fr-JP";
- tags = "de-DE, en, ja-JP-hepburn, fr, he";
- priorityList = LanguageRange.parse(ranges);
- tagList = generateLanguageTags(tags);
- actualTags = showLanguageTags(Locale.filterTags(priorityList, tagList));
- expectedTags = "ja-JP-hepburn, en";
-
- if (!expectedTags.equals(actualTags)) {
- error = true;
- showErrorMessage("#2 filterTags()",
- ranges, tags, expectedTags, actualTags);
- }
-
-
- ranges = "de-DE";
- tags = "de-DE, de-de, de-Latn-DE, de-Latf-DE, de-DE-x-goethe, "
- + "de-Latn-DE-1996, de-Deva-DE, de, de-x-DE, de-Deva";
- FilteringMode mode = MAP_EXTENDED_RANGES;
- priorityList = LanguageRange.parse(ranges);
- tagList = generateLanguageTags(tags);
- actualTags = showLanguageTags(Locale.filterTags(priorityList, tagList, mode));
- expectedTags = "de-DE, de-DE-x-goethe";
-
- if (!expectedTags.equals(actualTags)) {
- error = true;
- showErrorMessage("#3 filterTags(" + mode + ")",
- ranges, tags, expectedTags, actualTags);
+ String actualTags;
+ if (mode == null) {
+ actualTags = showLanguageTags(Locale.filterTags(priorityList, tagList));
+ } else {
+ actualTags = showLanguageTags(Locale.filterTags(priorityList, tagList, mode));
}
-
-
- ranges = "de-DE";
- tags = "de-DE, de-de, de-Latn-DE, de-Latf-DE, de-DE-x-goethe, "
- + "de-Latn-DE-1996, de-Deva-DE, de, de-x-DE, de-Deva";
- mode = EXTENDED_FILTERING;
- priorityList = LanguageRange.parse(ranges);
- tagList = generateLanguageTags(tags);
- actualTags = showLanguageTags(Locale.filterTags(priorityList, tagList, mode));
- expectedTags = "de-DE, de-Latn-DE, de-Latf-DE, de-DE-x-goethe, "
- + "de-Latn-DE-1996, de-Deva-DE";
-
- if (!expectedTags.equals(actualTags)) {
- error = true;
- showErrorMessage("#4 filterTags(" + mode + ")",
- ranges, tags, expectedTags, actualTags);
- }
-
-
- ranges = "de-*-DE";
- tags = "de-DE, de-de, de-Latn-DE, de-Latf-DE, de-DE-x-goethe, "
- + "de-Latn-DE-1996, de-Deva-DE, de, de-x-DE, de-Deva";
- mode = EXTENDED_FILTERING;
- priorityList = LanguageRange.parse(ranges);
- tagList = generateLanguageTags(tags);
- actualTags = showLanguageTags(Locale.filterTags(priorityList, tagList, mode));
- expectedTags = "de-DE, de-Latn-DE, de-Latf-DE, de-DE-x-goethe, "
- + "de-Latn-DE-1996, de-Deva-DE";
-
- if (!expectedTags.equals(actualTags)) {
- error = true;
- showErrorMessage("#5 filterTags(" + mode + ")",
- ranges, tags, expectedTags, actualTags);
- }
-
- if (error) {
- err = true;
- System.out.println(" test_filterTags() failed.");
- } else {
- System.out.println(" test_filterTags() passed.");
- }
+ assertEquals(actualTags, expectedTags,
+ showErrorMessage(" L.FilterTags(" + (mode != null ? mode : "") + ")",
+ ranges, tags, expectedTags, actualTags));
}
- private static void test_lookup() {
- boolean error = false;
-
- String ranges = "en;q=0.2, *-JP;q=0.6, iw";
- String tags = "de-DE, en, ja-JP-hepburn, fr-JP, he";
+ @Test(dataProvider = "LLookupData")
+ public void testLLookup(String ranges, String tags, String expectedLocale) {
List<LanguageRange> priorityList = LanguageRange.parse(ranges);
List<Locale> localeList = generateLocales(tags);
String actualLocale =
- Locale.lookup(priorityList, localeList).toLanguageTag();
- String expectedLocale ="he";
-
- if (!expectedLocale.equals(actualLocale)) {
- error = true;
- showErrorMessage("#1 lookup()", ranges, tags, expectedLocale, actualLocale);
- }
-
-
- ranges = "en;q=0.2, *-JP;q=0.6, iw";
- tags = "de-DE, he-IL, en, iw";
- priorityList = LanguageRange.parse(ranges);
- localeList = generateLocales(tags);
- actualLocale = Locale.lookup(priorityList, localeList).toLanguageTag();
- expectedLocale = "he";
-
- if (!expectedLocale.equals(actualLocale)) {
- error = true;
- showErrorMessage("#2 lookup()", ranges, tags, expectedLocale, actualLocale);
- }
-
-
- ranges = "en;q=0.2, ja-*-JP-x-foo;q=0.6, iw";
- tags = "de-DE, fr, en, ja-Latn-JP";
- priorityList = LanguageRange.parse(ranges);
- localeList = generateLocales(tags);
- actualLocale = Locale.lookup(priorityList, localeList).toLanguageTag();
- expectedLocale = "ja-Latn-JP";
-
- if (!expectedLocale.equals(actualLocale)) {
- error = true;
- showErrorMessage("#3 lookup()", ranges, tags, expectedLocale, actualLocale);
- }
-
- if (error) {
- err = true;
- System.out.println(" test_lookup() failed.");
- } else {
- System.out.println(" test_lookup() passed.");
- }
+ Locale.lookup(priorityList, localeList).toLanguageTag();
+ assertEquals(actualLocale, expectedLocale, showErrorMessage(" L.Lookup()",
+ ranges, tags, expectedLocale, actualLocale));
}
- private static void test_lookupTag() {
- boolean error = false;
-
- String ranges = "en, *";
- String tags = "es, de, ja-JP";
+ @Test(dataProvider = "LLookupTagData")
+ public void testLLookupTag(String ranges, String tags, String expectedTag) {
List<LanguageRange> priorityList = LanguageRange.parse(ranges);
List<String> tagList = generateLanguageTags(tags);
String actualTag = Locale.lookupTag(priorityList, tagList);
- String expectedTag = null;
-
- if (actualTag != null) {
- error = true;
- showErrorMessage("#1 lookupTag()", ranges, tags, expectedTag, actualTag);
- }
-
-
- ranges= "en;q=0.2, *-JP";
- tags = "de-DE, en, ja-JP-hepburn, fr-JP, en-JP";
- priorityList = LanguageRange.parse(ranges);
- tagList = generateLanguageTags(tags);
- actualTag = Locale.lookupTag(priorityList, tagList);
- expectedTag = "fr-JP";
-
- if (!expectedTag.equals(actualTag)) {
- error = true;
- showErrorMessage("#2 lookupTag()", ranges, tags, expectedTag, actualTag);
- }
-
-
- ranges = "en;q=0.2, ar-MO, iw";
- tags = "de-DE, he, fr-JP";
- priorityList = LanguageRange.parse(ranges);
- tagList = generateLanguageTags(tags);
- actualTag = Locale.lookupTag(priorityList, tagList);
- expectedTag = "he";
-
- if (!expectedTag.equals(actualTag)) {
- error = true;
- showErrorMessage("#3 lookupTag()", ranges, tags, expectedTag, actualTag);
- }
-
-
- ranges = "en;q=0.2, ar-MO, he";
- tags = "de-DE, iw, fr-JP";
- priorityList = LanguageRange.parse(ranges);
- tagList = generateLanguageTags(tags);
- actualTag = Locale.lookupTag(priorityList, tagList);
- expectedTag = "iw";
-
- if (!expectedTag.equals(actualTag)) {
- error = true;
- showErrorMessage("#4 lookupTag()", ranges, tags, expectedTag, actualTag);
- }
-
- if (error) {
- err = true;
- System.out.println(" test_lookupTag() failed.");
- } else {
- System.out.println(" test_lookupTag() passed.");
- }
+ assertEquals(actualTag, expectedTag, showErrorMessage(" L.LookupTag()",
+ ranges, tags, expectedTag, actualTag));
}
private static List<Locale> generateLocales(String tags) {
@@ -950,28 +423,6 @@
return tagList;
}
- private static String showPriorityList(List<LanguageRange> priorityList) {
- StringBuilder sb = new StringBuilder();
-
- Iterator<LanguageRange> itr = priorityList.iterator();
- LanguageRange lr;
- if (itr.hasNext()) {
- lr = itr.next();
- sb.append(lr.getRange());
- sb.append(";q=");
- sb.append(lr.getWeight());
- }
- while (itr.hasNext()) {
- sb.append(", ");
- lr = itr.next();
- sb.append(lr.getRange());
- sb.append(";q=");
- sb.append(lr.getWeight());
- }
-
- return sb.toString();
- }
-
private static String showLanguageTags(List<String> tags) {
StringBuilder sb = new StringBuilder();
@@ -1002,16 +453,15 @@
return sb.toString().trim();
}
- private static void showErrorMessage(String methodName,
- String priorityList,
- String tags,
- String expectedTags,
- String actualTags) {
- System.out.println("\nIncorrect " + methodName + " result.");
- System.out.println(" Priority list : " + priorityList);
- System.out.println(" Language tags : " + tags);
- System.out.println(" Expected value : " + expectedTags);
- System.out.println(" Actual value : " + actualTags);
+ private static String showErrorMessage(String methodName,
+ String priorityList,
+ String tags,
+ String expectedTags,
+ String actualTags) {
+ return "Incorrect " + methodName + " result."
+ + " Priority list : " + priorityList
+ + " Language tags : " + tags
+ + " Expected value : " + expectedTags
+ + " Actual value : " + actualTags;
}
-
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test/jdk/java/util/Locale/FilteringModeTest.java Thu Sep 27 10:49:10 2018 -0700
@@ -0,0 +1,91 @@
+/*
+ * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8210443
+ * @summary Check values() and valueOf(String name) of Locale.FilteringMode.
+ * @run main FilteringModeTest
+ */
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Locale.FilteringMode;
+import java.util.stream.Collectors;
+
+public class FilteringModeTest {
+ private static boolean err = false;
+ private static List<String> modeNames = List.of("AUTOSELECT_FILTERING",
+ "EXTENDED_FILTERING",
+ "IGNORE_EXTENDED_RANGES",
+ "MAP_EXTENDED_RANGES",
+ "REJECT_EXTENDED_RANGES");
+
+ public static void main(String[] args) throws Exception {
+ testValues();
+ testValueOf();
+
+ if (err) {
+ throw new RuntimeException("Failed.");
+ }
+ }
+
+ private static void testValueOf() {
+ try {
+ FilteringMode.valueOf("").name();
+ err = true;
+ System.err.println("IAE should be thrown for valueOf(\"\").");
+ } catch (IllegalArgumentException ex) {
+ }
+
+ try {
+ FilteringMode.valueOf(null).name();
+ err = true;
+ System.err.println("NPE should be thrown for valueOf(null).");
+ } catch (NullPointerException ex) {
+ }
+
+ modeNames.forEach((expectedName) -> {
+ String name = FilteringMode.valueOf(expectedName).name();
+ if (!expectedName.equals(name)) {
+ err = true;
+ System.err.println("FilteringMode.valueOf(" + expectedName
+ + ") returned unexpected value. Expected: "
+ + expectedName + ", got: " + name);
+ }
+ });
+ }
+
+ private static void testValues() {
+ FilteringMode[] modeArray = FilteringMode.values();
+ List<String> modeNames2 = Arrays.stream(modeArray)
+ .map(mode -> mode.name())
+ .collect(Collectors.toList());
+
+ if (!modeNames.equals(modeNames2)) {
+ err = true;
+ System.err.println("FilteringMode.values() returned unexpected value. Expected:"
+ + modeNames + " Got:" + modeNames2);
+ }
+ }
+}
--- a/test/jdk/java/util/stream/test/org/openjdk/tests/java/util/stream/CollectorsTest.java Wed Sep 26 18:36:55 2018 +0100
+++ b/test/jdk/java/util/stream/test/org/openjdk/tests/java/util/stream/CollectorsTest.java Thu Sep 27 10:49:10 2018 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -29,6 +29,7 @@
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
+import java.util.IntSummaryStatistics;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
@@ -39,6 +40,7 @@
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentSkipListMap;
import java.util.concurrent.atomic.AtomicInteger;
+import java.util.function.BiFunction;
import java.util.function.BinaryOperator;
import java.util.function.Function;
import java.util.function.Predicate;
@@ -96,7 +98,7 @@
@Override
void assertValue(R value, Supplier<Stream<T>> source, boolean ordered) throws ReflectiveOperationException {
downstream.assertValue(value,
- () -> source.get().map(mapper::apply),
+ () -> source.get().map(mapper),
ordered);
}
}
@@ -114,7 +116,7 @@
@Override
void assertValue(R value, Supplier<Stream<T>> source, boolean ordered) throws ReflectiveOperationException {
downstream.assertValue(value,
- () -> source.get().flatMap(mapper::apply),
+ () -> source.get().flatMap(mapper),
ordered);
}
}
@@ -287,6 +289,27 @@
}
}
+ static class TeeingAssertion<T, R1, R2, RR> extends CollectorAssertion<T, RR> {
+ private final Collector<T, ?, R1> c1;
+ private final Collector<T, ?, R2> c2;
+ private final BiFunction<? super R1, ? super R2, ? extends RR> finisher;
+
+ TeeingAssertion(Collector<T, ?, R1> c1, Collector<T, ?, R2> c2,
+ BiFunction<? super R1, ? super R2, ? extends RR> finisher) {
+ this.c1 = c1;
+ this.c2 = c2;
+ this.finisher = finisher;
+ }
+
+ @Override
+ void assertValue(RR value, Supplier<Stream<T>> source, boolean ordered) {
+ R1 r1 = source.get().collect(c1);
+ R2 r2 = source.get().collect(c2);
+ RR expected = finisher.apply(r1, r2);
+ assertEquals(value, expected);
+ }
+ }
+
private <T> ResultAsserter<T> mapTabulationAsserter(boolean ordered) {
return (act, exp, ord, par) -> {
if (par && (!ordered || !ord)) {
@@ -746,4 +769,42 @@
catch (UnsupportedOperationException ignored) { }
}
+ @Test(dataProvider = "StreamTestData<Integer>", dataProviderClass = StreamTestDataProvider.class)
+ public void testTeeing(String name, TestData.OfRef<Integer> data) throws ReflectiveOperationException {
+ Collector<Integer, ?, Long> summing = Collectors.summingLong(Integer::valueOf);
+ Collector<Integer, ?, Long> counting = Collectors.counting();
+ Collector<Integer, ?, Integer> min = collectingAndThen(Collectors.<Integer>minBy(Comparator.naturalOrder()),
+ opt -> opt.orElse(Integer.MAX_VALUE));
+ Collector<Integer, ?, Integer> max = collectingAndThen(Collectors.<Integer>maxBy(Comparator.naturalOrder()),
+ opt -> opt.orElse(Integer.MIN_VALUE));
+ Collector<Integer, ?, String> joining = mapping(String::valueOf, Collectors.joining(", ", "[", "]"));
+
+ Collector<Integer, ?, Map.Entry<Long, Long>> sumAndCount = Collectors.teeing(summing, counting, Map::entry);
+ Collector<Integer, ?, Map.Entry<Integer, Integer>> minAndMax = Collectors.teeing(min, max, Map::entry);
+ Collector<Integer, ?, Double> averaging = Collectors.teeing(summing, counting,
+ (sum, count) -> ((double)sum) / count);
+ Collector<Integer, ?, String> summaryStatistics = Collectors.teeing(sumAndCount, minAndMax,
+ (sumCountEntry, minMaxEntry) -> new IntSummaryStatistics(
+ sumCountEntry.getValue(), minMaxEntry.getKey(),
+ minMaxEntry.getValue(), sumCountEntry.getKey()).toString());
+ Collector<Integer, ?, String> countAndContent = Collectors.teeing(counting, joining,
+ (count, content) -> count+": "+content);
+
+ assertCollect(data, sumAndCount, stream -> {
+ List<Integer> list = stream.collect(toList());
+ return Map.entry(list.stream().mapToLong(Integer::intValue).sum(), (long) list.size());
+ });
+ assertCollect(data, averaging, stream -> stream.mapToInt(Integer::intValue).average().orElse(Double.NaN));
+ assertCollect(data, summaryStatistics,
+ stream -> stream.mapToInt(Integer::intValue).summaryStatistics().toString());
+ assertCollect(data, countAndContent, stream -> {
+ List<Integer> list = stream.collect(toList());
+ return list.size()+": "+list;
+ });
+
+ Function<Integer, Integer> classifier = i -> i % 3;
+ exerciseMapCollection(data, groupingBy(classifier, sumAndCount),
+ new GroupingByAssertion<>(classifier, Map.class,
+ new TeeingAssertion<>(summing, counting, Map::entry)));
+ }
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test/jdk/jdk/jfr/event/gc/collection/TestG1ParallelPhases.java Thu Sep 27 10:49:10 2018 -0700
@@ -0,0 +1,183 @@
+/*
+ * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package jdk.jfr.event.gc.collection;
+
+import static java.lang.System.gc;
+import static java.lang.Thread.sleep;
+import static java.util.Set.of;
+import static java.util.stream.Collectors.joining;
+import static java.util.stream.Collectors.toList;
+import static java.util.stream.Collectors.toSet;
+import static java.util.stream.IntStream.range;
+import static jdk.jfr.event.gc.collection.Provoker.provokeMixedGC;
+import static jdk.test.lib.Asserts.assertEquals;
+import static jdk.test.lib.Asserts.assertTrue;
+import static jdk.test.lib.jfr.Events.fromRecording;
+import static sun.hotspot.WhiteBox.getWhiteBox;
+
+import java.io.IOException;
+import java.lang.ref.WeakReference;
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Set;
+
+import jdk.jfr.Recording;
+import jdk.test.lib.Asserts;
+import jdk.test.lib.jfr.EventNames;
+import sun.hotspot.WhiteBox;
+
+/**
+ * @test
+ * @key jfr
+ * @requires vm.hasJFR
+ * @requires vm.gc == "G1" | vm.gc == null
+ * @library /test/lib /test/jdk
+ * @build sun.hotspot.WhiteBox
+ * @run main ClassFileInstaller sun.hotspot.WhiteBox
+ * @run main/othervm -XX:+UnlockExperimentalVMOptions -XX:MaxTenuringThreshold=1 -Xms20M -Xmx20M
+ * -XX:G1MixedGCLiveThresholdPercent=100 -XX:G1HeapWastePercent=0 -XX:G1HeapRegionSize=1m
+ * -XX:+UseG1GC -XX:+UseStringDeduplication
+ * -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI
+ * jdk.jfr.event.gc.collection.TestG1ParallelPhases
+ */
+
+public class TestG1ParallelPhases {
+ public static List<WeakReference<byte[]>> weakRefs;
+
+ public static void main(String[] args) throws IOException {
+ Recording recording = new Recording();
+ recording.enable(EventNames.GCPhaseParallel);
+ recording.start();
+
+ // create more weak garbage than can fit in this heap (-Xmx20m), will force collection of weak references
+ weakRefs = range(1, 100)
+ .mapToObj(n -> new WeakReference<>(new byte[1_000_000]))
+ .collect(toList()); // force evaluation of lazy stream (all weak refs must be created)
+
+ final var MEG = 1024 * 1024;
+ provokeMixedGC(1 * MEG);
+ recording.stop();
+
+ Set<String> usedPhases = fromRecording(recording).stream()
+ .map(e -> e.getValue("name").toString())
+ .collect(toSet());
+
+ Set<String> allPhases = of(
+ "ExtRootScan",
+ "ThreadRoots",
+ "StringTableRoots",
+ "UniverseRoots",
+ "JNIRoots",
+ "ObjectSynchronizerRoots",
+ "ManagementRoots",
+ "SystemDictionaryRoots",
+ "CLDGRoots",
+ "JVMTIRoots",
+ "CMRefRoots",
+ "WaitForStrongCLD",
+ "WeakCLDRoots",
+ "SATBFiltering",
+ "UpdateRS",
+ "ScanHCC",
+ "ScanRS",
+ "CodeRoots",
+ "ObjCopy",
+ "Termination",
+ "StringDedupQueueFixup",
+ "StringDedupTableFixup",
+ "RedirtyCards",
+ // "PreserveCMReferents",
+ "NonYoungFreeCSet",
+ "YoungFreeCSet"
+ );
+
+ assertTrue(usedPhases.equals(allPhases), "Compare events expected and received"
+ + ", Not found phases: " + allPhases.stream().filter(p -> !usedPhases.contains(p)).collect(joining(", "))
+ + ", Not expected phases: " + usedPhases.stream().filter(p -> !allPhases.contains(p)).collect(joining(", ")));
+ }
+}
+
+/**
+ * Utility class to guarantee a mixed GC. The class allocates several arrays and
+ * promotes them to the oldgen. After that it tries to provoke mixed GC by
+ * allocating new objects.
+ */
+class Provoker {
+ private static void allocateOldObjects(
+ List<byte[]> liveOldObjects,
+ int g1HeapRegionSize,
+ int arraySize) {
+
+ var toUnreachable = new ArrayList<byte[]>();
+
+ // Allocates buffer and promotes it to the old gen. Mix live and dead old objects.
+ // allocate about two regions of old memory. At least one full old region will guarantee
+ // mixed collection in the future
+ range(0, g1HeapRegionSize/arraySize).forEach(n -> {
+ liveOldObjects.add(new byte[arraySize]);
+ toUnreachable.add(new byte[arraySize]);
+ });
+
+ // Do two young collections, MaxTenuringThreshold=1 will force promotion.
+ getWhiteBox().youngGC();
+ getWhiteBox().youngGC();
+
+ // Check it is promoted & keep alive
+ Asserts.assertTrue(getWhiteBox().isObjectInOldGen(liveOldObjects), "List of the objects is suppose to be in OldGen");
+ Asserts.assertTrue(getWhiteBox().isObjectInOldGen(toUnreachable), "List of the objects is suppose to be in OldGen");
+ }
+
+ private static void waitTillCMCFinished(int sleepTime) {
+ while (getWhiteBox().g1InConcurrentMark()) {
+ try {sleep(sleepTime);} catch (Exception e) {}
+ }
+ }
+
+ /**
+ * The necessary condition for guaranteed mixed GC is running in VM with the following flags:
+ * -XX:+UnlockExperimentalVMOptions -XX:MaxTenuringThreshold=1 -Xms{HEAP_SIZE}M
+ * -Xmx{HEAP_SIZE}M -XX:G1MixedGCLiveThresholdPercent=100 -XX:G1HeapWastePercent=0
+ * -XX:G1HeapRegionSize={REGION_SIZE}m
+ *
+ * @param provokeSize The size to allocate to provoke the start of a mixed gc (half heap size?)
+ * @param g1HeapRegionSize The size of your regions in bytes
+ */
+ public static void provokeMixedGC(int g1HeapRegionSize) {
+ final var arraySize = 20_000;
+ var liveOldObjects = new ArrayList<byte[]>();
+ allocateOldObjects(liveOldObjects, g1HeapRegionSize, arraySize);
+ waitTillCMCFinished(10);
+ getWhiteBox().g1StartConcMarkCycle();
+ waitTillCMCFinished(10);
+ getWhiteBox().youngGC();
+ getWhiteBox().youngGC();
+
+ // check that liveOldObjects still alive
+ assertTrue(getWhiteBox().isObjectInOldGen(liveOldObjects), "List of the objects is suppose to be in OldGen");
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test/jdk/sanity/client/SwingSet/src/FrameDemoTest.java Thu Sep 27 10:49:10 2018 -0700
@@ -0,0 +1,296 @@
+/*
+ * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import static com.sun.swingset3.demos.frame.FrameDemo.BUSY_CHECKBOX;
+import static com.sun.swingset3.demos.frame.FrameDemo.CONTENT_LABEL;
+import static com.sun.swingset3.demos.frame.FrameDemo.CONTENT_LABEL_COLOR;
+import static com.sun.swingset3.demos.frame.FrameDemo.CONTENT_LABEL_SIZE;
+import static com.sun.swingset3.demos.frame.FrameDemo.DEMO_TITLE;
+import static com.sun.swingset3.demos.frame.FrameDemo.INTERNAL_FRAME;
+import static com.sun.swingset3.demos.frame.FrameDemo.MENU;
+import static com.sun.swingset3.demos.frame.FrameDemo.MENU_ITEM1;
+import static com.sun.swingset3.demos.frame.FrameDemo.MENU_ITEM2;
+import static com.sun.swingset3.demos.frame.FrameDemo.SHOW_BUTTON;
+import static com.sun.swingset3.demos.frame.FrameDemo.STATUS_LABEL;
+import static com.sun.swingset3.demos.frame.FrameDemo.STATUS_LABEL_BORDER;
+import static com.sun.swingset3.demos.frame.FrameDemo.STATUS_LABEL_HOR_ALIGNMENT;
+import static com.sun.swingset3.demos.frame.FrameDemo.TOOLBAR_BUTTON;
+import static org.jemmy2ext.JemmyExt.EXACT_STRING_COMPARATOR;
+import static org.testng.AssertJUnit.assertEquals;
+
+import java.awt.Component;
+import java.awt.Cursor;
+import java.awt.Dimension;
+import java.awt.Frame;
+import java.awt.Point;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+import javax.swing.JLabel;
+import javax.swing.JMenu;
+import javax.swing.JMenuBar;
+import javax.swing.JMenuItem;
+import javax.swing.UIManager;
+import javax.swing.event.MenuEvent;
+import javax.swing.event.MenuListener;
+
+import org.jtregext.GuiTestListener;
+import org.netbeans.jemmy.ClassReference;
+import org.netbeans.jemmy.ComponentChooser;
+import org.netbeans.jemmy.WindowWaiter;
+import org.netbeans.jemmy.operators.ComponentOperator;
+import org.netbeans.jemmy.operators.FrameOperator;
+import org.netbeans.jemmy.operators.JButtonOperator;
+import org.netbeans.jemmy.operators.JCheckBoxOperator;
+import org.netbeans.jemmy.operators.JFrameOperator;
+import org.netbeans.jemmy.operators.JLabelOperator;
+import org.netbeans.jemmy.operators.JMenuBarOperator;
+import org.netbeans.jemmy.operators.JMenuItemOperator;
+import org.netbeans.jemmy.operators.JMenuOperator;
+import org.testng.annotations.Listeners;
+import org.testng.annotations.Test;
+
+import com.sun.swingset3.demos.frame.FrameDemo;
+
+/*
+ * @test
+ * @key headful
+ * @summary Verifies SwingSet3 FrameDemo page by checking the different actions
+ * on the frame, properties and different actions on subcomponents of frame
+ * and control panel actions by checking and unchecking the busy check box and
+ * pressing the show button.
+ *
+ * @library /sanity/client/lib/jemmy/src
+ * @library /sanity/client/lib/Extensions/src
+ * @library /sanity/client/lib/SwingSet3/src
+ * @modules java.desktop
+ * java.logging
+ * @build org.jemmy2ext.JemmyExt
+ * @build com.sun.swingset3.demos.frame.FrameDemo
+ * @run testng FrameDemoTest
+ */
+@Listeners(GuiTestListener.class)
+public class FrameDemoTest {
+
+ private final static Dimension NEW_SIZE = new Dimension(500, 500);
+ private final static Point NEW_LOCATION = new Point(200, 200);
+ private final static int NUMBER_OF_MENUS = 1;
+ private final static int NUMBER_OF_MENU_ITEMS = 2;
+ private final static int MAX_NUMBER_OF_FRAMES = 1;
+ private final static int DELAY_AFTER_SHOW_BUTTON_PRESS = 500;
+
+ /**
+ * Testing the different actions on the frame, properties and different
+ * actions on subcomponents of the frame and control panel action by
+ * checking and unchecking the busy check box and pressing the show button.
+ *
+ * @throws Exception
+ */
+ @Test(dataProvider = "availableLookAndFeels", dataProviderClass = TestHelpers.class)
+ public void test(String lookAndFeel) throws Exception {
+ UIManager.setLookAndFeel(lookAndFeel);
+ new ClassReference(FrameDemo.class.getCanonicalName()).startApplication();
+
+ JFrameOperator masterFrameOperator = new JFrameOperator(DEMO_TITLE);
+ masterFrameOperator.setComparator(EXACT_STRING_COMPARATOR);
+
+ JFrameOperator internalFrameOperator = new JFrameOperator(INTERNAL_FRAME);
+ internalFrameOperator.setComparator(EXACT_STRING_COMPARATOR);
+ internalFrameOperator.setVerification(true);
+ internalFrameOperator.waitComponentVisible(true);
+
+ checkSubComponents(internalFrameOperator);
+ checkFrameActions(internalFrameOperator);
+ checkControlPanelActions(masterFrameOperator, internalFrameOperator);
+ }
+
+ /**
+ * Verifying the status of added components to the frame
+ * @param internalFrameOperator
+ */
+ private void checkSubComponents(JFrameOperator internalFrameOperator) {
+ // Verifying the properties of added button to the frame
+ JButtonOperator buttonOperator =
+ new JButtonOperator(internalFrameOperator, TOOLBAR_BUTTON);
+ AtomicBoolean buttonActionStatus = new AtomicBoolean(false);
+ buttonOperator.addActionListener(event -> buttonActionStatus.set(true));
+ buttonOperator.push();
+ buttonOperator.waitStateOnQueue(comp -> buttonActionStatus.get());
+
+ // Verifying the properties of added labels to the frame
+ JLabelOperator contentLabelOperator =
+ new JLabelOperator(internalFrameOperator, CONTENT_LABEL);
+ contentLabelOperator.waitStateOnQueue(comp
+ -> CONTENT_LABEL_SIZE.equals(comp.getSize()));
+ contentLabelOperator.waitStateOnQueue(comp
+ -> CONTENT_LABEL_COLOR.equals(comp.getBackground()));
+ JLabelOperator statusLabelOperator =
+ new JLabelOperator(internalFrameOperator, STATUS_LABEL);
+ statusLabelOperator.waitStateOnQueue(comp
+ -> STATUS_LABEL_BORDER.equals(((JLabel)comp).getBorder()));
+ statusLabelOperator.waitStateOnQueue((component) -> STATUS_LABEL_HOR_ALIGNMENT
+ == ((JLabel)component).getHorizontalAlignment());
+
+ // Verifying the properties of added menu to the frame
+ JMenuBarOperator menuBarOperator = new JMenuBarOperator(internalFrameOperator);
+ menuBarOperator.waitStateOnQueue(comp -> NUMBER_OF_MENUS
+ == ((JMenuBar)comp).getMenuCount());
+ JMenuOperator menuOperator = new JMenuOperator(internalFrameOperator, MENU);
+ menuOperator.waitStateOnQueue(comp -> NUMBER_OF_MENU_ITEMS
+ == ((JMenu)comp).getMenuComponentCount());
+ AtomicBoolean menuActionStatus = new AtomicBoolean(false);
+ addMenuListener(menuOperator, menuActionStatus);
+ menuOperator.push();
+ menuOperator.waitStateOnQueue(comp -> menuActionStatus.get());
+
+ // Verifying the properties of the menu items
+ checkMenuItem((JMenuItem) menuOperator.getMenuComponent(0), MENU_ITEM1);
+ checkMenuItem((JMenuItem) menuOperator.getMenuComponent(1), MENU_ITEM2);
+ }
+
+ /**
+ * Verifying different actions on the frame
+ * @param internalFrameOperator
+ */
+ private void checkFrameActions(JFrameOperator internalFrameOperator)
+ throws InterruptedException {
+ // Verifying the maximized status
+ internalFrameOperator.maximize();
+ // TODO This is a workaround for JDK-8210638, this delay has to remove
+ // after fixing this bug, this is an unstable code.
+ TestHelpers.delayBetweenFrameStateChange();
+ internalFrameOperator.demaximize();
+ // TODO This is a workaround for JDK-8210638, this delay has to remove
+ // after fixing this bug, this is an unstable code.
+ TestHelpers.delayBetweenFrameStateChange();
+
+ // Verifying the iconified status
+ internalFrameOperator.iconify();
+ // TODO This is a workaround for JDK-8210638, this delay has to remove
+ // after fixing this bug, this is an unstable code.
+ TestHelpers.delayBetweenFrameStateChange();
+ internalFrameOperator.deiconify();
+ // TODO This is a workaround for JDK-8210638, this delay has to remove
+ // after fixing this bug, this is an unstable code.
+ TestHelpers.delayBetweenFrameStateChange();
+
+ // Verifying the resize of the frame
+ TestHelpers.checkChangeSize(internalFrameOperator, NEW_SIZE);
+
+ // Verifying the change of location of the frame
+ TestHelpers.checkChangeLocation(internalFrameOperator, NEW_LOCATION);
+ }
+
+ /**
+ * Verifying control panel actions on the frame
+ * @param masterFrameOprator
+ * @param internalFrameOperator
+ * @throws InterruptedException
+ */
+ private void checkControlPanelActions(JFrameOperator masterFrameOprator,
+ JFrameOperator internalFrameOperator) throws InterruptedException {
+ // Verifying the visibility and number of frames after pressing Show Button
+ internalFrameOperator.requestClose();
+ internalFrameOperator.waitClosed();
+ JButtonOperator showButtonOperator = new JButtonOperator(masterFrameOprator, SHOW_BUTTON);
+ showButtonOperator.push();
+ internalFrameOperator.waitComponentVisible(true);
+ showButtonOperator.push();
+ showButtonOperator.push();
+ Thread.sleep(DELAY_AFTER_SHOW_BUTTON_PRESS);
+ int count = WindowWaiter.countWindows(masterFrameOprator.getOwner(),
+ new FrameOperator.FrameFinder(new ComponentChooser() {
+
+ @Override
+ public String getDescription() {
+ return "frames with name != " + DEMO_TITLE;
+ }
+
+ @Override
+ public boolean checkComponent(Component comp) {
+ return comp.isShowing()
+ && ((Frame) comp).getTitle() != DEMO_TITLE;
+ }
+ }));
+ assertEquals("Number of frames after clicking Show Button two times"
+ + " validation failed,", MAX_NUMBER_OF_FRAMES, count);
+
+ // Verifying the visibility and cursor type after selecting busy check box
+ JCheckBoxOperator busyCheckBoxOperator =
+ new JCheckBoxOperator(masterFrameOprator, BUSY_CHECKBOX);
+ busyCheckBoxOperator.setVerification(true);
+ checkBusyCheckBox(internalFrameOperator, busyCheckBoxOperator, true);
+ internalFrameOperator.waitStateOnQueue(comp -> Cursor.WAIT_CURSOR
+ == internalFrameOperator.getGlassPane().getCursor().getType());
+
+ checkBusyCheckBox(internalFrameOperator, busyCheckBoxOperator, false);
+ internalFrameOperator.waitStateOnQueue(comp -> Cursor.DEFAULT_CURSOR
+ == internalFrameOperator.getCursor().getType());
+ }
+
+ private void checkBusyCheckBox(JFrameOperator internalFrameOperator,
+ JCheckBoxOperator busyCheckBoxOperator, boolean isSelect) {
+ busyCheckBoxOperator.changeSelection(isSelect);
+ new ComponentOperator(internalFrameOperator.
+ getGlassPane()).waitComponentVisible(isSelect);
+ }
+
+ /**
+ * Verifying the properties of the menu item
+ * @param menuItem : menu item component
+ * @param menuExpectedName : expected menu item name/text
+ */
+ private void checkMenuItem(JMenuItem menuItem, String menuExpectedName) {
+ JMenuItemOperator menuItemOperator = new JMenuItemOperator(menuItem);
+ AtomicBoolean menuItemActionStatus = new AtomicBoolean(false);
+ menuItemOperator.addActionListener(event -> menuItemActionStatus.set(true));
+ menuItemOperator.waitStateOnQueue((component)
+ -> menuExpectedName.equals(((JMenuItem)component).getText()));
+ menuItemOperator.push();
+ menuItemOperator.waitStateOnQueue(comp -> menuItemActionStatus.get());
+ }
+
+ /**
+ * Add menu listener to the operator
+ * @param menuOperator : JMenuOperator on which menu listener has to be added
+ * @param menuActionStatus : menu action status variable
+ */
+ private void addMenuListener(JMenuOperator menuOperator,
+ AtomicBoolean menuActionStatus) {
+ menuOperator.addMenuListener(new MenuListener() {
+
+ @Override
+ public void menuSelected(MenuEvent e) {
+ menuActionStatus.set(true);
+ }
+
+ @Override
+ public void menuDeselected(MenuEvent e) {
+ }
+
+ @Override
+ public void menuCanceled(MenuEvent e) {
+ }
+ });
+ }
+
+}
\ No newline at end of file
--- a/test/jdk/sanity/client/SwingSet/src/InternalFrameDemoTest.java Wed Sep 26 18:36:55 2018 +0100
+++ b/test/jdk/sanity/client/SwingSet/src/InternalFrameDemoTest.java Thu Sep 27 10:49:10 2018 -0700
@@ -138,6 +138,9 @@
orignalSize.height - PARENT_FRAME_NEW_SIZE_DELTA);
parentFrameOperator.resize(newSize.width, newSize.height);
parentFrameOperator.waitComponentSize(newSize);
+ // TODO This is a workaround for JDK-8210638, this delay has to remove
+ // after fixing this bug, this is an unstable code.
+ TestHelpers.delayBetweenFrameStateChange();
// keeping some delay before checking the internal frame property
// as it is a negative scenario
Thread.sleep(DELAY);
@@ -145,26 +148,41 @@
// Resizing parent frame back to original size
parentFrameOperator.resize(orignalSize.width, orignalSize.height);
parentFrameOperator.waitComponentSize(orignalSize);
+ // TODO This is a workaround for JDK-8210638, this delay has to remove
+ // after fixing this bug, this is an unstable code.
+ TestHelpers.delayBetweenFrameStateChange();
// Iconifying the parent frame and verifying the iconified status of the internal
// frame(it should not be iconified)
parentFrameOperator.iconify();
+ // TODO This is a workaround for JDK-8210638, this delay has to remove
+ // after fixing this bug, this is an unstable code.
+ TestHelpers.delayBetweenFrameStateChange();
// keeping some delay before checking the internal frame property
// as it is a negative scenario
Thread.sleep(DELAY);
assertFalse("Internal Frame should not be iconified when parent frame"
+ " alone is iconified.", internalFrameOperator.isIcon());
parentFrameOperator.deiconify();
+ // TODO This is a workaround for JDK-8210638, this delay has to remove
+ // after fixing this bug, this is an unstable code.
+ TestHelpers.delayBetweenFrameStateChange();
// Maximizing the parent frame and verifying the maximized status of the internal
// frame(it should not be maximized)
parentFrameOperator.maximize();
+ // TODO This is a workaround for JDK-8210638, this delay has to remove
+ // after fixing this bug, this is an unstable code.
+ TestHelpers.delayBetweenFrameStateChange();
// keeping some delay before checking the internal frame property
// as it is a negative scenario
Thread.sleep(DELAY);
assertFalse("Internal Frame should not be maximized when parent frame"
+ " alone is maximized.", internalFrameOperator.isMaximum());
parentFrameOperator.demaximize();
+ // TODO This is a workaround for JDK-8210638, this delay has to remove
+ // after fixing this bug, this is an unstable code.
+ TestHelpers.delayBetweenFrameStateChange();
// Relocating the parent frame and verifying the location of the internal
// frame(it should not be changed the location)
@@ -173,6 +191,9 @@
(orignalLocation.y + PARENT_FRAME_NEW_LOCATION_DELTA));
parentFrameOperator.move(newLocation.x, newLocation.y);
parentFrameOperator.waitComponentLocation(newLocation);
+ // TODO This is a workaround for JDK-8210638, this delay has to remove
+ // after fixing this bug, this is an unstable code.
+ TestHelpers.delayBetweenFrameStateChange();
// keeping some delay before checking the internal frame property
// as it is a negative scenario
Thread.sleep(DELAY);
@@ -180,15 +201,19 @@
// Moving back parent frame to original location
parentFrameOperator.move(orignalLocation.x, orignalLocation.y);
parentFrameOperator.waitComponentLocation(orignalLocation);
+ // TODO This is a workaround for JDK-8210638, this delay has to remove
+ // after fixing this bug, this is an unstable code.
+ TestHelpers.delayBetweenFrameStateChange();
}
/**
* Verifying different actions on the internal frame.
*
* @param internalFrameOperator : internal fame operator
+ * @throws InterruptedException
*/
- private void checkInternalFrameAction(
- JInternalFrameOperator internalFrameOperator) {
+ private void checkInternalFrameAction(JInternalFrameOperator
+ internalFrameOperator) throws InterruptedException {
// Verifying maximize and demaximize actions
internalFrameOperator.waitStateOnQueue(comp
-> ((JInternalFrame)comp).isMaximizable());
--- a/test/jdk/sanity/client/SwingSet/src/TestHelpers.java Wed Sep 26 18:36:55 2018 +0100
+++ b/test/jdk/sanity/client/SwingSet/src/TestHelpers.java Thu Sep 27 10:49:10 2018 -0700
@@ -1,16 +1,38 @@
+/*
+ * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
import java.awt.Dimension;
import java.awt.Point;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.nio.channels.FileChannel;
-import java.nio.file.Path;
+
import javax.swing.UIManager;
+
import org.netbeans.jemmy.operators.ComponentOperator;
import org.testng.annotations.DataProvider;
public class TestHelpers {
+ public static final long DELAY_BTWN_FRAME_STATE_CHANGE = 2000;
+
/**
* A DataProvider having the class name of all the available look and feels
*
@@ -29,21 +51,40 @@
}
public static void checkChangeLocation(ComponentOperator component,
- Point finalLocation) {
+ Point finalLocation) throws InterruptedException {
Point initialLocation = component.getLocation();
component.setLocation(finalLocation);
component.waitComponentLocation(finalLocation);
+ // TODO This is a workaround for JDK-8210638, this delay has to remove
+ // after fixing this bug, this is an unstable code.
+ delayBetweenFrameStateChange();
component.setLocation(initialLocation);
component.waitComponentLocation(initialLocation);
+ // TODO This is a workaround for JDK-8210638, this delay has to remove
+ // after fixing this bug, this is an unstable code.
+ delayBetweenFrameStateChange();
}
public static void checkChangeSize(ComponentOperator component,
- Dimension dimensionFinal) {
+ Dimension dimensionFinal) throws InterruptedException {
Dimension dimensionInitial = component.getSize();
component.setSize(dimensionFinal);
component.waitComponentSize(dimensionFinal);
+ // TODO This is a workaround for JDK-8210638, this delay has to remove
+ // after fixing this bug, this is an unstable code.
+ delayBetweenFrameStateChange();
component.setSize(dimensionInitial);
component.waitComponentSize(dimensionInitial);
+ // TODO This is a workaround for JDK-8210638, this delay has to remove
+ // after fixing this bug, this is an unstable code.
+ delayBetweenFrameStateChange();
}
-}
+ // TODO This is a workaround for JDK-8210638, this delay has to remove
+ // after fixing this bug, this is an unstable code.
+ public static void delayBetweenFrameStateChange()
+ throws InterruptedException {
+ Thread.sleep(DELAY_BTWN_FRAME_STATE_CHANGE);
+ }
+
+}
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test/jdk/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/frame/BusyGlass.java Thu Sep 27 10:49:10 2018 -0700
@@ -0,0 +1,76 @@
+/*
+ * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.swingset3.demos.frame;
+
+import java.awt.BorderLayout;
+import java.awt.Color;
+import java.awt.Cursor;
+import java.awt.Graphics;
+import javax.swing.JPanel;
+
+/**
+ * GlassPane component which can be set on toplevel
+ * containers to makes those containers "busy" be disabling input.
+ *
+ * Example usage:
+ * <pre><code>
+ * // Install glasspane
+ * frame.setGlassPane(new BusyGlass());
+ *
+ * // Make frame busy
+ * frame.getGlassPane().setVisible(true);
+ * </code></pre>
+ *
+ * Caution: A well-written client should rarely need to make
+ * a window "busy" because the app should be as responsive as possible;
+ * long-winded operations should be off-loaded to non-GUI threads
+ * whenever possible.
+ *
+ * @author aim
+ */
+//<snip>Make toplevel "busy"
+public class BusyGlass extends JPanel {
+
+ /**
+ * Create GlassPane component to block input on toplevel
+ */
+ public BusyGlass() {
+ setLayout(new BorderLayout());
+ setVisible(false); //initially invisible
+ setOpaque(false);
+ setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
+ }
+
+ protected void paintComponent(Graphics g) {
+ // Render partially opaque to 'veil' the frame's contents so
+ // that the user has visual feedback that the components
+ // arn't responsive.
+ Color bgColor = getBackground();
+ g.setColor(new Color(bgColor.getRed(),
+ bgColor.getGreen(),
+ bgColor.getBlue(), 150));
+ g.fillRect(0, 0, getWidth(), getHeight());
+ }
+}
+//</snip>
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test/jdk/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/frame/FrameDemo.java Thu Sep 27 10:49:10 2018 -0700
@@ -0,0 +1,272 @@
+/*
+* Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
+* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+*
+* This code is free software; you can redistribute it and/or modify it
+* under the terms of the GNU General Public License version 2 only, as
+* published by the Free Software Foundation.
+*
+* This code is distributed in the hope that it will be useful, but WITHOUT
+* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+* version 2 for more details (a copy is included in the LICENSE file that
+* accompanied this code).
+*
+* You should have received a copy of the GNU General Public License version
+* 2 along with this work; if not, write to the Free Software Foundation,
+* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+*
+* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+* or visit www.oracle.com if you need additional information or have any
+* questions.
+*/
+
+package com.sun.swingset3.demos.frame;
+
+import java.awt.BorderLayout;
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.EventQueue;
+import java.awt.Image;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.net.URL;
+
+import javax.imageio.ImageIO;
+import javax.swing.Box;
+import javax.swing.JButton;
+import javax.swing.JCheckBox;
+import javax.swing.JComponent;
+import javax.swing.JFrame;
+import javax.swing.JLabel;
+import javax.swing.JMenu;
+import javax.swing.JMenuBar;
+import javax.swing.JPanel;
+import javax.swing.JToolBar;
+import javax.swing.SwingConstants;
+import javax.swing.border.EmptyBorder;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
+
+import com.sun.swingset3.DemoProperties;
+import com.sun.swingset3.demos.DemoUtilities;
+
+/**
+* Demo for Swing's JFrame toplevel component.
+*
+* @author aim
+*/
+@DemoProperties(
+value = "JFrame Demo",
+category = "Toplevel Containers",
+description = "Demonstrates JFrame, Swing's top-level primary window container.",
+sourceFiles = {
+"com/sun/swingset3/demos/frame/BusyGlass.java",
+"com/sun/swingset3/demos/frame/FrameDemo.java",
+"com/sun/swingset3/demos/DemoUtilities.java",
+"com/sun/swingset3/demos/frame/resources/FrameDemo.html",
+"com/sun/swingset3/demos/frame/resources/images/FrameDemo.gif"
+}
+)
+public class FrameDemo extends JPanel {
+
+public static final String DEMO_TITLE = FrameDemo.class.getAnnotation(DemoProperties.class).value();
+public static final String INTERNAL_FRAME = "Demo JFrame";
+public static final String MENU = "File";
+public static final String MENU_ITEM1 = "Open";
+public static final String MENU_ITEM2 = "Save";
+public static final String TOOLBAR = "Toolbar";
+public static final String TOOLBAR_BUTTON = "Toolbar Button";
+public static final String CONTENT_LABEL = "I'm content but a little blue.";
+public static final String STATUS_LABEL = "I show status.";
+public static final String SHOW_BUTTON = "Show JFrame...";
+public static final String BUSY_CHECKBOX = "Frame busy";
+public static final Dimension CONTENT_LABEL_SIZE = new Dimension(300, 160);
+public static final Color CONTENT_LABEL_COLOR = new Color(197, 216, 236);
+public static final int STATUS_LABEL_HOR_ALIGNMENT = JLabel.LEADING;
+public static final EmptyBorder STATUS_LABEL_BORDER = new EmptyBorder(4, 4, 4, 4);
+
+//<snip>Ensure system menubar is used on Mac OSX
+static {
+// Property must be set *early* due to Apple Bug#3909714
+// ignored on other platforms
+if (System.getProperty("os.name").equals("Mac OS X")) {
+System.setProperty("apple.laf.useScreenMenuBar", "true");
+}
+}
+//</snip>
+
+// Toplevel frame component
+private JFrame frame;
+
+private JComponent frameSpaceholder;
+
+public FrameDemo() {
+initComponents();
+}
+
+protected void initComponents() {
+frame = createFrame();
+
+setLayout(new BorderLayout());
+add(createControlPanel(), BorderLayout.WEST);
+frameSpaceholder = createFrameSpaceholder(frame);
+add(frameSpaceholder, BorderLayout.CENTER);
+}
+
+protected JComponent createControlPanel() {
+Box controlPanel = Box.createVerticalBox();
+controlPanel.setBorder(new EmptyBorder(8, 8, 8, 8));
+
+// Create button to control visibility of frame
+JButton showButton = new JButton(SHOW_BUTTON);
+showButton.addActionListener(new ShowActionListener());
+controlPanel.add(showButton);
+
+// Create checkbox to control busy state of frame
+JCheckBox busyCheckBox = new JCheckBox(BUSY_CHECKBOX);
+busyCheckBox.setSelected(false);
+busyCheckBox.addChangeListener(new BusyChangeListener());
+controlPanel.add(busyCheckBox);
+
+return controlPanel;
+}
+
+private static JComponent createFrameSpaceholder(JFrame frame) {
+JPanel framePlaceholder = new JPanel();
+Dimension prefSize = frame.getPreferredSize();
+prefSize.width += 12;
+prefSize.height += 12;
+framePlaceholder.setPreferredSize(prefSize);
+
+return framePlaceholder;
+}
+
+private static JFrame createFrame() {
+
+//<snip>Create frame and set simple properties
+JFrame frame = new JFrame(INTERNAL_FRAME);
+frame.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
+//</snip>
+
+//<snip>Set Minimized/titlebar icon Image
+//Note: How the image is used is platform-dependent
+Image iconImage = null;
+try {
+// todo: swingingduke.gif doesn't exist
+URL imageURL = FrameDemo.class.getResource("resources/images/swingingduke.gif");
+iconImage = ImageIO.read(imageURL);
+} catch (Exception e) {
+// handle image IO exception
+}
+frame.setIconImage(iconImage);
+//</snip>
+
+//<snip>Make toplevel "busy"
+// busy glasspane is initially invisible
+frame.setGlassPane(new BusyGlass());
+//</snip>
+
+//<snip>Add a menubar
+JMenuBar menubar = new JMenuBar();
+frame.setJMenuBar(menubar);
+JMenu menu = new JMenu(MENU);
+menubar.add(menu);
+menu.add(MENU_ITEM1);
+menu.add(MENU_ITEM2);
+//</snip>
+
+//<snip>Add a horizontal toolbar
+JToolBar toolbar = new JToolBar(TOOLBAR);
+frame.add(toolbar, BorderLayout.NORTH);
+toolbar.add(new JButton(TOOLBAR_BUTTON));
+//</snip>
+
+//<snip>Add the content area
+JLabel label = new JLabel(CONTENT_LABEL);
+label.setHorizontalAlignment(JLabel.CENTER);
+label.setPreferredSize(CONTENT_LABEL_SIZE);
+label.setBackground(CONTENT_LABEL_COLOR);
+label.setOpaque(true); // labels non-opaque by default
+frame.add(label);
+//snip
+
+//<snip>Add a statusbar
+JLabel statusLabel = new JLabel(STATUS_LABEL);
+statusLabel.setBorder(STATUS_LABEL_BORDER);
+statusLabel.setHorizontalAlignment(STATUS_LABEL_HOR_ALIGNMENT);
+frame.add(statusLabel, BorderLayout.SOUTH);
+//</snip>
+
+//<snip>Initialize frame's size to fit it's content
+frame.pack();
+//</snip>
+
+return frame;
+}
+
+public void start() {
+DemoUtilities.setToplevelLocation(frame, frameSpaceholder, SwingConstants.CENTER);
+showFrame();
+}
+
+public void stop() {
+//<snip>Hide frame
+frame.setVisible(false);
+//</snip>
+}
+
+public void showFrame() {
+//<snip>Show frame
+// if frame already visible, then bring to the front
+if (frame.isShowing()) {
+frame.toFront();
+} else {
+frame.setVisible(true);
+}
+//</snip>
+}
+
+//<snip>Make toplevel "busy"
+public void setFrameBusy(boolean busy) {
+frame.getGlassPane().setVisible(busy);
+// Must explicitly disable the menubar because on OSX it will be
+// in the system menubar and not covered by the glasspane
+frame.getJMenuBar().setEnabled(!busy);
+}
+
+public boolean isFrameBusy() {
+return frame.getGlassPane().isVisible();
+}
+//</snip
+
+// remind(aim): replace with Beans binding
+
+private class ShowActionListener implements ActionListener {
+public void actionPerformed(ActionEvent actionEvent) {
+showFrame();
+}
+}
+
+private class BusyChangeListener implements ChangeListener {
+public void stateChanged(ChangeEvent changeEvent) {
+JCheckBox busyCheckBox = (JCheckBox) changeEvent.getSource();
+setFrameBusy(busyCheckBox.isSelected());
+showFrame(); // bring frame back to front for demo purposes
+}
+}
+
+public static void main(String args[]) {
+EventQueue.invokeLater(new Runnable() {
+public void run() {
+JFrame frame = new JFrame(DEMO_TITLE);
+FrameDemo demo = new FrameDemo();
+frame.add(demo);
+frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+frame.pack();
+frame.setVisible(true);
+demo.start();
+}
+});
+}
+}
Binary file test/jdk/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/frame/resources/images/FrameDemo.gif has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test/jdk/sun/net/www/protocol/http/GetErrorStream.java Thu Sep 27 10:49:10 2018 -0700
@@ -0,0 +1,89 @@
+/*
+ * Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 4160499
+ * @modules jdk.httpserver
+ * @summary sun.net.www.protocol.http.HttpURLConnection.getErrorStream not hooked up
+ */
+import static java.net.HttpURLConnection.HTTP_NOT_FOUND;
+
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.HttpURLConnection;
+import java.net.InetAddress;
+import java.net.InetSocketAddress;
+import java.net.URL;
+import java.net.URLConnection;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+import com.sun.net.httpserver.HttpExchange;
+import com.sun.net.httpserver.HttpHandler;
+import com.sun.net.httpserver.HttpServer;
+
+public class GetErrorStream {
+ public static void main(String[] args) throws Exception {
+ InetSocketAddress addr = new InetSocketAddress(InetAddress.getLoopbackAddress(), 0);
+ HttpServer server = HttpServer.create(addr, 10);
+ server.createContext("/" + HTTP_NOT_FOUND, he -> {
+ final String RESPONSE = "Test: File Not Found.";
+ he.sendResponseHeaders(HTTP_NOT_FOUND, RESPONSE.length());
+ OutputStream os = he.getResponseBody();
+ os.write(RESPONSE.getBytes());
+ os.close();
+ });
+ int port = server.getAddress().getPort();
+ System.out.println("Server port = " + port);
+
+ ExecutorService executor = Executors.newCachedThreadPool();
+ server.setExecutor(executor);
+ server.start();
+
+ URL url = new URL("http://localhost:" + port + "/" + HTTP_NOT_FOUND);
+ URLConnection conn = url.openConnection();
+
+ try {
+ InputStream is = conn.getInputStream();
+ throw new RuntimeException("Expect HTTP_NOT_FOUND!");
+ } catch (FileNotFoundException e) {
+ try {
+ int respCode = ((HttpURLConnection) conn).getResponseCode();
+ InputStream es = ((HttpURLConnection) conn).getErrorStream();
+ if (respCode == HTTP_NOT_FOUND && es != null) {
+ System.out.println("Passed!");
+ } else {
+ throw new RuntimeException("getErrorStream failure.");
+ }
+ } catch (Exception ex) {
+ }
+ } finally {
+ server.stop(0);
+ executor.shutdownNow();
+ }
+
+ }
+}
--- a/test/langtools/jdk/javadoc/doclet/JavascriptWinTitle/JavascriptWinTitle.java Wed Sep 26 18:36:55 2018 +0100
+++ b/test/langtools/jdk/javadoc/doclet/JavascriptWinTitle/JavascriptWinTitle.java Thu Sep 27 10:49:10 2018 -0700
@@ -23,7 +23,7 @@
/*
* @test
- * @bug 4645058 4747738 4855054 8024756 8141492 8196202
+ * @bug 4645058 4747738 4855054 8024756 8141492 8196202 8205593
* @summary Javascript IE load error when linked by -linkoffline
* Window title shouldn't change when loading left frames (javascript)
* @author dkramer
@@ -43,6 +43,7 @@
@Test
void test() {
javadoc("-d", "out",
+ "-source", "8",
"--frames",
"-doctitle", "Document Title",
"-windowtitle", "Window Title",
--- a/test/langtools/jdk/javadoc/doclet/testClassCrossReferences/C.java Wed Sep 26 18:36:55 2018 +0100
+++ b/test/langtools/jdk/javadoc/doclet/testClassCrossReferences/C.java Thu Sep 27 10:49:10 2018 -0700
@@ -26,7 +26,7 @@
* Cross link to inner class: {@link javax.swing.text.AbstractDocument.AttributeContext Link to AttributeContext innerclass} <br>
* Cross link to class: {@link java.math.BigDecimal Link to external class BigDecimal}<br>
* Cross link to member: {@link java.math.BigInteger#gcd(java.math.BigInteger) Link to external member gcd}<br>
- * Cross link to package: {@link javax.tools.SimpleJavaFileObject#URI Link to external member URI}<br>
+ * Cross link to package: {@link javax.tools.SimpleJavaFileObject#uri Link to external member URI}<br>
*/
public class C {
--- a/test/langtools/jdk/javadoc/doclet/testClassCrossReferences/TestClassCrossReferences.java Wed Sep 26 18:36:55 2018 +0100
+++ b/test/langtools/jdk/javadoc/doclet/testClassCrossReferences/TestClassCrossReferences.java Thu Sep 27 10:49:10 2018 -0700
@@ -23,7 +23,7 @@
/*
* @test
- * @bug 4652655 4857717 8025633 8026567 8071982 8164407 8182765
+ * @bug 4652655 4857717 8025633 8026567 8071982 8164407 8182765 8205593
* @summary This test verifies that class cross references work properly.
* @author jamieh
* @library ../lib
@@ -45,6 +45,7 @@
@Test
void test() {
javadoc("-d", "out",
+ "-source", "8",
"-Xdoclint:none",
"-sourcepath", testSrc,
"-linkoffline", uri, testSrc,
@@ -60,7 +61,7 @@
+ "title=\"class or interface in java.math\" class=\"externalLink\"><code>Link to external class BigDecimal</code></a>",
"<a href=\"" + uri + "java/math/BigInteger.html?is-external=true#gcd(java.math.BigInteger)\" "
+ "title=\"class or interface in java.math\" class=\"externalLink\"><code>Link to external member gcd</code></a>",
- "<a href=\"" + uri + "javax/tools/SimpleJavaFileObject.html?is-external=true#URI\" "
+ "<a href=\"" + uri + "javax/tools/SimpleJavaFileObject.html?is-external=true#uri\" "
+ "title=\"class or interface in javax.tools\" class=\"externalLink\"><code>Link to external member URI</code></a>",
"<dl>\n"
+ "<dt><span class=\"overrideSpecifyLabel\">Overrides:</span></dt>\n"
@@ -69,8 +70,22 @@
}
@Test
+ void test_error() {
+ javadoc("-d", "out-error",
+ "-Xdoclint:none",
+ "-sourcepath", testSrc,
+ "-linkoffline", uri, testSrc,
+ testSrc("C.java"));
+ checkExit(Exit.ERROR);
+ checkOutput(Output.OUT, true,
+ "The code being documented uses modules but the packages defined"
+ + " in http://docs.oracle.com/javase/8/docs/api/ are in the unnamed module");
+ }
+
+ @Test
void test_html4() {
javadoc("-d", "out-html4",
+ "-source", "8",
"-html4",
"-Xdoclint:none",
"-sourcepath", testSrc,
--- a/test/langtools/jdk/javadoc/doclet/testDocRootInlineTag/TestDocRootInlineTag.java Wed Sep 26 18:36:55 2018 +0100
+++ b/test/langtools/jdk/javadoc/doclet/testDocRootInlineTag/TestDocRootInlineTag.java Thu Sep 27 10:49:10 2018 -0700
@@ -23,7 +23,7 @@
/*
* @test
- * @bug 4369014 4851991 8164407
+ * @bug 4369014 4851991 8164407 8205593
* @summary Determine if the docRoot inline tag works properly.
* If docRoot performs as documented, the test passes.
* Make sure that the docRoot tag works with the -bottom option.
@@ -47,6 +47,7 @@
javadoc("-bottom", "The value of @docRoot is \"{@docRoot}\"",
"-d", "out",
+ "-source", "8",
"-sourcepath", testSrc,
"-linkoffline", uri, testSrc,
testSrc("TestDocRootTag.java"), "pkg");
--- a/test/langtools/jdk/javadoc/doclet/testExternalOverridenMethod/TestExternalOverridenMethod.java Wed Sep 26 18:36:55 2018 +0100
+++ b/test/langtools/jdk/javadoc/doclet/testExternalOverridenMethod/TestExternalOverridenMethod.java Thu Sep 27 10:49:10 2018 -0700
@@ -23,7 +23,7 @@
/*
* @test
- * @bug 4857717 8025633 8026567 8164407 8182765
+ * @bug 4857717 8025633 8026567 8164407 8182765 8205593
* @summary Test to make sure that externally overriden and implemented methods
* are documented properly. The method should still include "implements" or
* "overrides" documentation even though the method is external.
@@ -45,6 +45,7 @@
@Test
void test() {
javadoc("-d", "out",
+ "-source","8",
"-sourcepath", testSrc,
"-linkoffline", uri, testSrc,
"pkg");
@@ -67,6 +68,7 @@
@Test
void test_html4() {
javadoc("-d", "out-html4",
+ "-source", "8",
"-html4",
"-sourcepath", testSrc,
"-linkoffline", uri, testSrc,
--- a/test/langtools/jdk/javadoc/doclet/testHref/TestHref.java Wed Sep 26 18:36:55 2018 +0100
+++ b/test/langtools/jdk/javadoc/doclet/testHref/TestHref.java Thu Sep 27 10:49:10 2018 -0700
@@ -23,7 +23,7 @@
/*
* @test
- * @bug 4663254 8016328 8025633 8026567 8081854 8182765
+ * @bug 4663254 8016328 8025633 8026567 8081854 8182765 8205593
* @summary Verify that spaces do not appear in hrefs and anchors.
* @author jamieh
* @library ../lib
@@ -43,6 +43,7 @@
void test() {
javadoc("-Xdoclint:none",
"-d", "out",
+ "-source", "8",
"-sourcepath", testSrc,
"-linkoffline", "http://java.sun.com/j2se/1.4/docs/api/", testSrc,
"pkg");
@@ -85,6 +86,7 @@
void test_html4() {
javadoc("-Xdoclint:none",
"-d", "out-html4",
+ "-source", "8",
"-html4",
"-sourcepath", testSrc,
"-linkoffline", "http://java.sun.com/j2se/1.4/docs/api/", testSrc,
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test/langtools/jdk/javadoc/doclet/testIndexTaglet/TestIndexTaglet.java Thu Sep 27 10:49:10 2018 -0700
@@ -0,0 +1,90 @@
+/*
+ * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8202462
+ * @summary {@index} may cause duplicate labels
+ * @library /tools/lib ../lib
+ * @modules jdk.javadoc/jdk.javadoc.internal.tool
+ * @build JavadocTester toolbox.ToolBox builder.ClassBuilder
+ * @run main TestIndexTaglet
+ */
+
+
+import java.nio.file.Path;
+import java.nio.file.Paths;
+
+import builder.ClassBuilder;
+import builder.ClassBuilder.MethodBuilder;
+import toolbox.ToolBox;
+
+public class TestIndexTaglet extends JavadocTester {
+
+ final ToolBox tb;
+
+ public static void main(String... args) throws Exception {
+ TestIndexTaglet tester = new TestIndexTaglet();
+ tester.runTests(m -> new Object[]{Paths.get(m.getName())});
+ }
+
+ TestIndexTaglet() {
+ tb = new ToolBox();
+ }
+
+ @Test
+ void test(Path base) throws Exception {
+ Path srcDir = base.resolve("src");
+ createTestClass(srcDir);
+
+ Path outDir = base.resolve("out");
+ javadoc("-d", outDir.toString(),
+ "-sourcepath", srcDir.toString(),
+ "pkg");
+
+ checkExit(Exit.OK);
+
+ checkOrder("pkg/A.html",
+ "<h3>Method Detail</h3>\n",
+ "<div class=\"block\">test description with <a id=\"search_phrase_a\" "
+ + "class=\"searchTagResult\">search_phrase_a</a></div>");
+
+ checkOrder("pkg/A.html",
+ "<h3>Method Summary</h3>\n",
+ "<div class=\"block\">test description with search_phrase_a</div>");
+ }
+
+ void createTestClass(Path srcDir) throws Exception {
+ MethodBuilder method = MethodBuilder
+ .parse("public void func(A a) {}")
+ .setComments("test description with {@index search_phrase_a class a}");
+
+ new ClassBuilder(tb, "pkg.A")
+ .setModifiers("public", "class")
+ .addMembers(method)
+ .write(srcDir);
+
+ }
+}
--- a/test/langtools/jdk/javadoc/doclet/testLinkOption/TestLinkOption.java Wed Sep 26 18:36:55 2018 +0100
+++ b/test/langtools/jdk/javadoc/doclet/testLinkOption/TestLinkOption.java Thu Sep 27 10:49:10 2018 -0700
@@ -23,7 +23,7 @@
/*
* @test
- * @bug 4720957 5020118 8026567 8038976 8184969 8164407 8182765
+ * @bug 4720957 5020118 8026567 8038976 8184969 8164407 8182765 8205593
* @summary Test to make sure that -link and -linkoffline link to
* right files, and URLs with and without trailing slash are accepted.
* @author jamieh
@@ -61,6 +61,7 @@
String out1 = "out1";
String url = "http://acme.com/jdk/";
javadoc("-d", out1,
+ "-source", "8",
"-classpath", mylib,
"-sourcepath", testSrc,
"-linkoffline", url, testSrc + "/jdk",
@@ -113,6 +114,7 @@
String out1_html4 = "out1-html4";
javadoc("-d", out1_html4,
+ "-source", "8",
"-html4",
"-classpath", mylib,
"-sourcepath", testSrc,
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test/langtools/jdk/javadoc/doclet/testLinkOption/TestLinkOptionWithModule.java Thu Sep 27 10:49:10 2018 -0700
@@ -0,0 +1,166 @@
+/*
+ * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8205593
+ * @summary Javadoc -link makes broken links if module name matches package name
+ * @library /tools/lib ../lib
+ * @modules
+ * jdk.javadoc/jdk.javadoc.internal.tool
+ * jdk.compiler/com.sun.tools.javac.api
+ * jdk.compiler/com.sun.tools.javac.main
+ * @build JavadocTester
+ * @run main TestLinkOptionWithModule
+ */
+
+import java.nio.file.Path;
+import java.nio.file.Paths;
+
+import builder.ClassBuilder;
+import builder.ClassBuilder.*;
+import toolbox.ModuleBuilder;
+import toolbox.ToolBox;
+
+
+public class TestLinkOptionWithModule extends JavadocTester {
+
+ final ToolBox tb;
+ private final Path src;
+
+ public static void main(String... args) throws Exception {
+ TestLinkOptionWithModule tester = new TestLinkOptionWithModule();
+ tester.runTests(m -> new Object[]{Paths.get(m.getName())});
+ }
+
+ TestLinkOptionWithModule() throws Exception {
+ tb = new ToolBox();
+ src = Paths.get("src");
+ initModulesAndPackages();
+ }
+
+ @Test
+ void testModuleLinkedToModule(Path base) throws Exception {
+ Path out1 = base.resolve("out1a"), out2 = base.resolve("out1b");
+
+ javadoc("-d", out1.toString(),
+ "--module-source-path", src.toString(),
+ "--module", "com.ex1");
+
+ javadoc("-d", out2.toString(),
+ "--module-source-path", src.toString(),
+ "--module", "com.ex2",
+ "-link", "../" + out1.getFileName());
+
+ checkExit(Exit.OK);
+ checkOutput("com.ex2/com/ex2/B.html", true,
+ "<a href=\"../../../../out1a/com.ex1/com/ex1/A.html?is-external=true\" "
+ + "title=\"class or interface in com.ex1\" class=\"externalLink\">A</a>");
+ }
+
+ @Test
+ void testPackageLinkedToPackage(Path base) throws Exception {
+ Path out1 = base.resolve("out2a"), out2 = base.resolve("out2b");
+
+ javadoc("-d", out1.toString(),
+ "-sourcepath", src.toString(),
+ "-subpackages", "com.ex1");
+
+ javadoc("-d", out2.toString(),
+ "-sourcepath", src.toString(),
+ "-subpackages", "com.ex2",
+ "-link", "../" + out1.getFileName());
+
+ checkExit(Exit.OK);
+ checkOutput("com/ex2/B.html", true,
+ "<a href=\"../../../out2a/com/ex1/A.html?is-external=true\" title=\"class or interface in com.ex1\" "
+ + "class=\"externalLink\">A</a>");
+ }
+
+ @Test
+ void testModuleLinkedToPackage(Path base) throws Exception {
+ Path out1 = base.resolve("out3a"), out2 = base.resolve("out3b");
+
+ javadoc("-d", out1.toString(),
+ "-sourcepath", src.toString(),
+ "-subpackages", "com.ex1");
+
+ javadoc("-d", out2.toString(),
+ "--module-source-path", src.toString(),
+ "--module", "com.ex2",
+ "-link", "../" + out1.getFileName());
+
+ checkExit(Exit.ERROR);
+ checkOutput(Output.OUT, true,
+ "The code being documented uses modules but the packages defined "
+ + "in ../out3a/ are in the unnamed module");
+ }
+
+ @Test
+ void testPackageLinkedToModule(Path base) throws Exception {
+ Path out1 = base.resolve("out4a"), out2 = base.resolve("out4b");
+
+ javadoc("-d", out1.toString(),
+ "--module-source-path", src.toString(),
+ "--module", "com.ex1");
+
+ javadoc("-d", out2.toString(),
+ "-sourcepath", src.toString(),
+ "-subpackages", "com.ex2",
+ "-link", "../" + out1.getFileName());
+
+ checkExit(Exit.ERROR);
+ checkOutput(Output.OUT, true,
+ "The code being documented uses packages in the unnamed module, but the packages defined "
+ + "in ../out4a/ are in named modules");
+ }
+
+
+ void initModulesAndPackages() throws Exception{
+ new ModuleBuilder(tb, "com.ex1")
+ .exports("com.ex1")
+ .classes("package com.ex1; public class A{}")
+ .write(src);
+
+ new ModuleBuilder(tb, "com.ex2")
+ .requires("com.ex1")
+ .exports("com.ex2")
+ .classes("package com.ex2; \n"
+ + "import com.ex1.A;\n"
+ + "public class B{\n"
+ + "public B(A obj){}\n"
+ + "}\n")
+ .write(src);
+
+ new ClassBuilder(tb, "com.ex1.A")
+ .setModifiers("public","class")
+ .write(src);
+
+ new ClassBuilder(tb, "com.ex2.B")
+ .addImports("com.ex1.A")
+ .setModifiers("public","class")
+ .addMembers(MethodBuilder.parse("public void foo(A a)"))
+ .write(src);
+ }
+
+}
--- a/test/langtools/jdk/javadoc/doclet/testLinkOption/TestNewLineInLink.java Wed Sep 26 18:36:55 2018 +0100
+++ b/test/langtools/jdk/javadoc/doclet/testLinkOption/TestNewLineInLink.java Thu Sep 27 10:49:10 2018 -0700
@@ -23,7 +23,7 @@
/*
* @test
- * @bug 4739870
+ * @bug 4739870 8205593
* @summary Make sure that a new line may act as a separator between
* link and label.
* @author jamieh
@@ -43,6 +43,7 @@
@Test
void test() {
javadoc("-d", "out",
+ "-source", "8",
"-sourcepath", testSrc,
"-linkoffline", "http://www.java.sun.com/j2se/1.4/docs/api", testSrc("jdk"),
"testNewLineInLink");
--- a/test/langtools/jdk/javadoc/doclet/testModules/TestModules.java Wed Sep 26 18:36:55 2018 +0100
+++ b/test/langtools/jdk/javadoc/doclet/testModules/TestModules.java Thu Sep 27 10:49:10 2018 -0700
@@ -26,7 +26,7 @@
* @bug 8154119 8154262 8156077 8157987 8154261 8154817 8135291 8155995 8162363
* 8168766 8168688 8162674 8160196 8175799 8174974 8176778 8177562 8175218
* 8175823 8166306 8178043 8181622 8183511 8169819 8074407 8183037 8191464
- 8164407 8192007 8182765 8196200 8196201 8196202 8196202
+ 8164407 8192007 8182765 8196200 8196201 8196202 8196202 8205593 8202462
* @summary Test modules support in javadoc.
* @author bpatel
* @library ../lib
@@ -252,13 +252,11 @@
*/
@Test
void testAggregatorModuleSummary() {
- setAutomaticCheckLinks(false); // @ignore JDK-8202628
javadoc("-d", "out-aggregatorModuleSummary",
"-use",
"--module-source-path", testSrc,
"--expand-requires", "transitive",
"--module", "moduleT");
- setAutomaticCheckLinks(true); // @ignore JDK-8202628
checkExit(Exit.OK);
checkAggregatorModuleSummary();
}
@@ -1071,7 +1069,7 @@
+ "<th class=\"colSecond\" scope=\"row\"><a href=\"../moduleA/module-summary.html\">moduleA</a></th>\n"
+ "<td class=\"colLast\">\n"
+ "<div class=\"block\">This is a test description for the moduleA module with a Search "
- + "phrase <a id=\"searchphrase\" class=\"searchTagResult\">search phrase</a>.</div>\n"
+ + "phrase search phrase.</div>\n"
+ "</td>\n"
+ "</tr>\n"
+ "<tr class=\"rowColor\">\n"
@@ -1164,7 +1162,7 @@
+ "<dt><a href=\"moduleA/module-summary.html\">moduleA</a> - module moduleA</dt>\n"
+ "<dd>\n"
+ "<div class=\"block\">This is a test description for the moduleA module with a Search "
- + "phrase <a id=\"searchphrase\" class=\"searchTagResult\">search phrase</a>.</div>\n"
+ + "phrase search phrase.</div>\n"
+ "</dd>\n"
+ "<dt><a href=\"moduleB/module-summary.html\">moduleB</a> - module moduleB</dt>\n"
+ "<dd>\n"
@@ -1193,7 +1191,7 @@
"<th class=\"colFirst\" scope=\"row\"><a href=\"moduleA/module-summary.html\">moduleA</a></th>\n"
+ "<td class=\"colLast\">\n"
+ "<div class=\"block\">This is a test description for the moduleA module with a Search "
- + "phrase <a id=\"searchphrase\" class=\"searchTagResult\">search phrase</a>.</div>\n"
+ + "phrase search phrase.</div>\n"
+ "</td>",
"<th class=\"colFirst\" scope=\"row\"><a href=\"moduleB/module-summary.html\">moduleB</a></th>\n"
+ "<td class=\"colLast\">\n"
@@ -1235,7 +1233,7 @@
+ "<th class=\"colSecond\" scope=\"row\"><a href=\"../moduleA/module-summary.html\">moduleA</a></th>\n"
+ "<td class=\"colLast\">\n"
+ "<div class=\"block\">This is a test description for the moduleA module with a Search "
- + "phrase <a id=\"searchphrase\" class=\"searchTagResult\">search phrase</a>.</div>\n"
+ + "phrase search phrase.</div>\n"
+ "</td>",
"<table class=\"requiresSummary\">\n"
+ "<caption><span>Requires</span><span class=\"tabEnd\"> </span></caption>\n"
@@ -1617,10 +1615,10 @@
void checkLinkOffline() {
checkOutput("moduleB/testpkg3mdlB/package-summary.html", true,
- "<a href=\"https://docs.oracle.com/javase/9/docs/api/java/lang/String.html?is-external=true\" "
+ "<a href=\"https://docs.oracle.com/javase/9/docs/api/java.base/java/lang/String.html?is-external=true\" "
+ "title=\"class or interface in java.lang\" class=\"externalLink\"><code>Link to String Class</code></a>");
checkOutput("moduleB/testpkg3mdlB/package-summary.html", true,
- "<a href=\"https://docs.oracle.com/javase/9/docs/api/java/lang/package-summary.html?is-external=true\" "
+ "<a href=\"https://docs.oracle.com/javase/9/docs/api/java.base/java/lang/package-summary.html?is-external=true\" "
+ "class=\"externalLink\"><code>Link to java.lang package</code></a>");
checkOutput("moduleB/testpkg3mdlB/package-summary.html", true,
"<a href=\"https://docs.oracle.com/javase/9/docs/api/java.base/module-summary.html?is-external=true\" "
--- a/test/langtools/jdk/javadoc/doclet/testNewLanguageFeatures/TestNewLanguageFeatures.java Wed Sep 26 18:36:55 2018 +0100
+++ b/test/langtools/jdk/javadoc/doclet/testNewLanguageFeatures/TestNewLanguageFeatures.java Thu Sep 27 10:49:10 2018 -0700
@@ -24,7 +24,7 @@
/*
* @test
* @bug 4789689 4905985 4927164 4827184 4993906 5004549 7025314 7010344 8025633 8026567 8162363
- * 8175200 8186332 8182765 8196202 8187288
+ * 8175200 8186332 8182765 8196202 8187288 8173730
* @summary Run Javadoc on a set of source files that demonstrate new
* language features. Check the output to ensure that the new
* language features are properly documented.
@@ -93,7 +93,6 @@
// Automatically insert documentation for values() and valueOf().
"Returns an array containing the constants of this enum type,",
"Returns the enum constant of this type with the specified name",
- "for (Coin c : Coin.values())",
"Overloaded valueOf() method has correct documentation.",
"Overloaded values method has correct documentation.",
"<pre class=\"methodSignature\">public static <a href=\"Coin.html\" title=\"enum in pkg\">Coin</a>" +
--- a/test/langtools/jdk/javadoc/doclet/testTitleInHref/TestTitleInHref.java Wed Sep 26 18:36:55 2018 +0100
+++ b/test/langtools/jdk/javadoc/doclet/testTitleInHref/TestTitleInHref.java Thu Sep 27 10:49:10 2018 -0700
@@ -23,7 +23,7 @@
/*
* @test
- * @bug 4714257 8164407
+ * @bug 4714257 8164407 8205593
* @summary Test to make sure that the title attribute shows up in links.
* @author jamieh
* @library ../lib
@@ -43,6 +43,7 @@
void test() {
String uri = "http://java.sun.com/j2se/1.4/docs/api";
javadoc("-d", "out",
+ "-source", "8",
"-sourcepath", testSrc,
"-linkoffline", uri, testSrc,
"pkg");
--- a/test/langtools/jdk/javadoc/tool/api/basic/IsSupportedOptionTest.java Wed Sep 26 18:36:55 2018 +0100
+++ b/test/langtools/jdk/javadoc/tool/api/basic/IsSupportedOptionTest.java Thu Sep 27 10:49:10 2018 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -23,7 +23,7 @@
/*
* @test
- * @bug 6493690
+ * @bug 6493690 8210555
* @summary javadoc should have a javax.tools.Tool service provider
* @modules java.compiler
* jdk.compiler
@@ -48,6 +48,8 @@
@Test
public void test() throws Exception {
DocumentationTool tool = ToolProvider.getSystemDocumentationTool();
+ check(tool, "-source", 1);
+ check(tool, "--source", 1);
check(tool, "-sourcepath", 1);
check(tool, "-verbose", 0);
check(tool, "-ZZZ", -1);
--- a/test/langtools/jdk/javadoc/tool/sourceOption/SourceOption.java Wed Sep 26 18:36:55 2018 +0100
+++ b/test/langtools/jdk/javadoc/tool/sourceOption/SourceOption.java Thu Sep 27 10:49:10 2018 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -33,25 +33,20 @@
*/
/*
- * TEST NOTE
- * With JDK9, this test has been transformed into a NEGATIVE test.
+ * In order to test whether or not the -source option is working
+ * correctly, this test tries to parse source code that contains
+ * a feature that is not available in at least one of the currently
+ * supported previous versions.
*
- * Generally speaking, this test should check a feature not in at least
- * one of the currently supported previous versions. In this manner,
- * a failure of the -source option to be honored would mean a pass of
- * the test, and therefore a failure of the -source option.
+ * Parsing such code should be expected to fail; if the action
+ * passes, that means the -source option is (incorrectly) ineffective.
*
- * For JDK9 and JDK10, both support 1.7, which did not support javac's
- * lambda construct. So we set "-source 1.7" to compile a .java file
- * containing the lambda construct. javac should fail, thus showing
- * -source to be working. Thus the test passes.
- *
- * The second jtreg @run command checks to make sure that the source
+ * Additional actions are performed to ensure that the source
* provided is valid for the current release of the JDK.
*
- * fixVersion: JDK11
- * replace ./p/LambdaConstructTest.java with a missing from
- * JDK8, JDK9, or JDK10. Set -source below appropriately.
+ * As support for older versions of the platform are dropped, the
+ * source code (currently p/LambdaConstructTest.java) will need to
+ * be updated with a more recent feature.
*/
import java.util.ArrayList;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test/langtools/tools/javac/analyzer/AnalyzersCheckSourceLevel.java Thu Sep 27 10:49:10 2018 -0700
@@ -0,0 +1,15 @@
+/*
+ * @test /nodynamiccopyright/
+ * @bug 8211102
+ * @summary Ensure that the lambda analyzer does not run when -source 7 is specified,
+ * even if explicitly requested
+ * @compile/fail/ref=AnalyzersCheckSourceLevel.out -Werror -XDfind=lambda -XDrawDiagnostics AnalyzersCheckSourceLevel.java
+ * @compile -Werror -source 7 -Xlint:-options -XDfind=lambda AnalyzersCheckSourceLevel.java
+ */
+public class AnalyzersCheckSourceLevel {
+ void t() {
+ Runnable r = new Runnable() {
+ @Override public void run() {}
+ };
+ }
+}
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test/langtools/tools/javac/analyzer/AnalyzersCheckSourceLevel.out Thu Sep 27 10:49:10 2018 -0700
@@ -0,0 +1,4 @@
+AnalyzersCheckSourceLevel.java:11:37: compiler.warn.potential.lambda.found
+- compiler.err.warnings.and.werror
+1 error
+1 warning
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test/langtools/tools/javac/analyzer/T8211102.java Thu Sep 27 10:49:10 2018 -0700
@@ -0,0 +1,37 @@
+/*
+ * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * @test
+ * @bug 8211102
+ * @summary Verify javac does not crash in lambda analyzer
+ * @compile -Werror -XDfind=lambda -source 7 -Xlint:-options T8211102.java
+ */
+import java.util.*;
+
+public class T8211102 {
+ private void t(boolean b) {
+ (b ? Collections.emptyList()
+ : new Iterable<String>() { public Iterator<String> iterator() { return null; } }).toString();
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test/langtools/tools/javac/flags/FlagsTest.java Thu Sep 27 10:49:10 2018 -0700
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2018, Google LLC. 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.
+ */
+
+/**
+ * @test
+ * @bug 8211138
+ * @summary Missing Flag enum constants
+ * @library /tools/javac/lib
+ * @modules jdk.compiler/com.sun.tools.javac.code
+ * @run main FlagsTest
+ */
+import com.sun.tools.javac.code.Flags;
+import java.lang.reflect.Field;
+import java.lang.reflect.Modifier;
+
+public class FlagsTest {
+ public static void main(String[] args) throws IllegalAccessException {
+ for (Field f : Flags.class.getFields()) {
+ if (!Modifier.isStatic(f.getModifiers())) {
+ continue;
+ }
+ long flag = ((Number) f.get(null)).longValue();
+ try {
+ Flags.asFlagSet(flag);
+ } catch (AssertionError e) {
+ throw new AssertionError("missing Flags enum constant for: " + f.getName(), e);
+ }
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test/langtools/tools/javac/lambda/LambdaNoFuncIntfFlow.java Thu Sep 27 10:49:10 2018 -0700
@@ -0,0 +1,16 @@
+/**
+ * @test /nodynamiccopyright/
+ * @bug 8211102
+ * @summary Ensure Flow does not crash for recovered lambdas
+ * @compile/fail/ref=LambdaNoFuncIntfFlow.out -XDshould-stop.at=FLOW -XDrawDiagnostics LambdaNoFuncIntfFlow.java
+ */
+
+import java.util.*;
+
+public class LambdaNoFuncIntfFlow {
+ private void t(Object i) {
+ int j = i instanceof ArrayList ? (ArrayList<String>) i : () -> { return null; };
+ j = 0;
+ Runnable r = () -> t(j);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test/langtools/tools/javac/lambda/LambdaNoFuncIntfFlow.out Thu Sep 27 10:49:10 2018 -0700
@@ -0,0 +1,6 @@
+LambdaNoFuncIntfFlow.java:12:42: compiler.err.prob.found.req: (compiler.misc.incompatible.type.in.conditional: (compiler.misc.inconvertible.types: java.util.ArrayList<java.lang.String>, int))
+LambdaNoFuncIntfFlow.java:12:66: compiler.err.prob.found.req: (compiler.misc.incompatible.type.in.conditional: (compiler.misc.not.a.functional.intf: int))
+LambdaNoFuncIntfFlow.java:14:30: compiler.err.cant.ref.non.effectively.final.var: j, (compiler.misc.lambda)
+- compiler.note.unchecked.filename: LambdaNoFuncIntfFlow.java
+- compiler.note.unchecked.recompile
+3 errors
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test/langtools/tools/javac/lambda/NoTargetLambda.java Thu Sep 27 10:49:10 2018 -0700
@@ -0,0 +1,12 @@
+/*
+ * @test /nodynamiccopyright/
+ * @bug 8211102
+ * @summary Ensure javac does not crash for (invalid) lambda in standalone conditional expression.
+ * @compile/fail/ref=NoTargetLambda.out -XDrawDiagnostics NoTargetLambda.java
+ */
+
+public class NoTargetLambda {
+ private void t(boolean b) {
+ (b ? "" : () -> { return null; }).toString();
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test/langtools/tools/javac/lambda/NoTargetLambda.out Thu Sep 27 10:49:10 2018 -0700
@@ -0,0 +1,2 @@
+NoTargetLambda.java:10:19: compiler.err.unexpected.lambda
+1 error
--- a/test/langtools/tools/javac/launcher/SourceLauncherTest.java Wed Sep 26 18:36:55 2018 +0100
+++ b/test/langtools/tools/javac/launcher/SourceLauncherTest.java Thu Sep 27 10:49:10 2018 -0700
@@ -47,6 +47,7 @@
import java.util.Collections;
import java.util.List;
import java.util.Properties;
+import java.util.regex.Pattern;
import com.sun.tools.javac.launcher.Main;
@@ -191,6 +192,80 @@
checkEqual("stdout", log.trim(), "Hello World! [1, 2, 3]");
}
+ @Test
+ public void testCodeSource(Path base) throws IOException {
+ tb.writeJavaFiles(base,
+ "import java.net.URL;\n" +
+ "class ShowCodeSource {\n" +
+ " public static void main(String... args) {\n" +
+ " URL u = ShowCodeSource.class.getProtectionDomain().getCodeSource().getLocation();\n" +
+ " System.out.println(u);\n" +
+ " }\n" +
+ "}");
+
+ Path file = base.resolve("ShowCodeSource.java");
+ String log = new JavaTask(tb)
+ .className(file.toString())
+ .run(Task.Expect.SUCCESS)
+ .getOutput(Task.OutputKind.STDOUT);
+ checkEqual("stdout", log.trim(), file.toAbsolutePath().toUri().toURL().toString());
+ }
+
+ @Test
+ public void testPermissions(Path base) throws IOException {
+ Path policyFile = base.resolve("test.policy");
+ Path sourceFile = base.resolve("TestPermissions.java");
+
+ tb.writeFile(policyFile,
+ "grant codeBase \"jrt:/jdk.compiler\" {\n" +
+ " permission java.security.AllPermission;\n" +
+ "};\n" +
+ "grant codeBase \"" + sourceFile.toUri().toURL() + "\" {\n" +
+ " permission java.util.PropertyPermission \"user.dir\", \"read\";\n" +
+ "};\n");
+
+ tb.writeJavaFiles(base,
+ "import java.net.URL;\n" +
+ "class TestPermissions {\n" +
+ " public static void main(String... args) {\n" +
+ " System.out.println(\"user.dir=\" + System.getProperty(\"user.dir\"));\n" +
+ " try {\n" +
+ " System.setProperty(\"user.dir\", \"\");\n" +
+ " System.out.println(\"no exception\");\n" +
+ " System.exit(1);\n" +
+ " } catch (SecurityException e) {\n" +
+ " System.out.println(\"exception: \" + e);\n" +
+ " }\n" +
+ " }\n" +
+ "}");
+
+ String log = new JavaTask(tb)
+ .vmOptions("-Djava.security.manager", "-Djava.security.policy=" + policyFile)
+ .className(sourceFile.toString())
+ .run(Task.Expect.SUCCESS)
+ .getOutput(Task.OutputKind.STDOUT);
+ checkEqual("stdout", log.trim(),
+ "user.dir=" + System.getProperty("user.dir") + "\n" +
+ "exception: java.security.AccessControlException: " +
+ "access denied (\"java.util.PropertyPermission\" \"user.dir\" \"write\")");
+ }
+
+ public void testSystemProperty(Path base) throws IOException {
+ tb.writeJavaFiles(base,
+ "class ShowProperty {\n" +
+ " public static void main(String... args) {\n" +
+ " System.out.println(System.getProperty(\"jdk.launcher.sourcefile\"));\n" +
+ " }\n" +
+ "}");
+
+ Path file = base.resolve("ShowProperty.java");
+ String log = new JavaTask(tb)
+ .className(file.toString())
+ .run(Task.Expect.SUCCESS)
+ .getOutput(Task.OutputKind.STDOUT);
+ checkEqual("stdout", log.trim(), file.toAbsolutePath().toString());
+ }
+
void testSuccess(Path file, String expect) throws IOException {
Result r = run(file, Collections.emptyList(), List.of("1", "2", "3"));
checkEqual("stdout", r.stdOut, expect);
@@ -233,22 +308,98 @@
}
@Test
- public void testWrongClass(Path base) throws IOException {
+ public void testLoadClass(Path base) throws IOException {
+ Path src1 = base.resolve("src1");
+ Path file1 = src1.resolve("LoadClass.java");
+ tb.writeJavaFiles(src1,
+ "class LoadClass {\n"
+ + " public static void main(String... args) {\n"
+ + " System.out.println(\"on classpath\");\n"
+ + " };\n"
+ + "}\n");
+ Path classes1 = Files.createDirectories(base.resolve("classes"));
+ new JavacTask(tb)
+ .outdir(classes1)
+ .files(file1)
+ .run();
+ String log1 = new JavaTask(tb)
+ .classpath(classes1.toString())
+ .className("LoadClass")
+ .run(Task.Expect.SUCCESS)
+ .getOutput(Task.OutputKind.STDOUT);
+ checkEqual("stdout", log1.trim(),
+ "on classpath");
+
+ Path src2 = base.resolve("src2");
+ Path file2 = src2.resolve("LoadClass.java");
+ tb.writeJavaFiles(src2,
+ "class LoadClass {\n"
+ + " public static void main(String... args) {\n"
+ + " System.out.println(\"in source file\");\n"
+ + " };\n"
+ + "}\n");
+ String log2 = new JavaTask(tb)
+ .classpath(classes1.toString())
+ .className(file2.toString())
+ .run(Task.Expect.SUCCESS)
+ .getOutput(Task.OutputKind.STDOUT);
+ checkEqual("stdout", log2.trim(),
+ "in source file");
+ }
+
+ @Test
+ public void testGetResource(Path base) throws IOException {
Path src = base.resolve("src");
- Path file = src.resolve("WrongClass.java");
- tb.writeJavaFiles(src, "class WrongClass { }");
+ Path file = src.resolve("GetResource.java");
+ tb.writeJavaFiles(src,
+ "class GetResource {\n"
+ + " public static void main(String... args) {\n"
+ + " System.out.println(GetResource.class.getClassLoader().getResource(\"GetResource.class\"));\n"
+ + " };\n"
+ + "}\n");
Path classes = Files.createDirectories(base.resolve("classes"));
new JavacTask(tb)
.outdir(classes)
.files(file)
.run();
+
String log = new JavaTask(tb)
.classpath(classes.toString())
.className(file.toString())
- .run(Task.Expect.FAIL)
- .getOutput(Task.OutputKind.STDERR);
- checkEqual("stderr", log.trim(),
- "error: class found on application class path: WrongClass");
+ .run(Task.Expect.SUCCESS)
+ .getOutput(Task.OutputKind.STDOUT);
+ checkMatch("stdout", log.trim(),
+ Pattern.compile("sourcelauncher-memoryclassloader[0-9]+:GetResource.class"));
+ }
+
+ @Test
+ public void testGetResources(Path base) throws IOException {
+ Path src = base.resolve("src");
+ Path file = src.resolve("GetResources.java");
+ tb.writeJavaFiles(src,
+ "import java.io.*; import java.net.*; import java.util.*;\n"
+ + "class GetResources {\n"
+ + " public static void main(String... args) throws IOException {\n"
+ + " Enumeration<URL> e =\n"
+ + " GetResources.class.getClassLoader().getResources(\"GetResources.class\");\n"
+ + " while (e.hasMoreElements()) System.out.println(e.nextElement());\n"
+ + " };\n"
+ + "}\n");
+ Path classes = Files.createDirectories(base.resolve("classes"));
+ new JavacTask(tb)
+ .outdir(classes)
+ .files(file)
+ .run();
+
+ List<String> log = new JavaTask(tb)
+ .classpath(classes.toString())
+ .className(file.toString())
+ .run(Task.Expect.SUCCESS)
+ .getOutputLines(Task.OutputKind.STDOUT);
+ checkMatch("stdout:0", log.get(0).trim(),
+ Pattern.compile("sourcelauncher-memoryclassloader[0-9]+:GetResources.class"));
+ checkMatch("stdout:1", log.get(1).trim(),
+ Pattern.compile("file:/.*/testGetResources/classes/GetResources.class"));
}
@Test
@@ -294,7 +445,37 @@
checkEmpty("stdout", r.stdOut);
checkEqual("stderr", r.stdErr, expectStdErr);
checkFault("exception", r.exception, "error: compilation failed");
+ }
+ @Test
+ public void testClassNotFound(Path base) throws IOException {
+ Path src = base.resolve("src");
+ Path file = src.resolve("ClassNotFound.java");
+ tb.writeJavaFiles(src,
+ "class ClassNotFound {\n"
+ + " public static void main(String... args) {\n"
+ + " try {\n"
+ + " Class.forName(\"NoSuchClass\");\n"
+ + " System.out.println(\"no exception\");\n"
+ + " System.exit(1);\n"
+ + " } catch (ClassNotFoundException e) {\n"
+ + " System.out.println(\"Expected exception thrown: \" + e);\n"
+ + " }\n"
+ + " };\n"
+ + "}\n");
+ Path classes = Files.createDirectories(base.resolve("classes"));
+ new JavacTask(tb)
+ .outdir(classes)
+ .files(file)
+ .run();
+
+ String log = new JavaTask(tb)
+ .classpath(classes.toString())
+ .className(file.toString())
+ .run(Task.Expect.SUCCESS)
+ .getOutput(Task.OutputKind.STDOUT);
+ checkEqual("stdout", log.trim(),
+ "Expected exception thrown: java.lang.ClassNotFoundException: NoSuchClass");
}
// For any source file that is invoked through the OS shebang mechanism, invalid shebang
@@ -471,12 +652,18 @@
void checkEqual(String name, String found, String expect) {
expect = expect.replace("\n", tb.lineSeparator);
out.println(name + ": " + found);
- out.println(name + ": " + found);
if (!expect.equals(found)) {
error("Unexpected output; expected: " + expect);
}
}
+ void checkMatch(String name, String found, Pattern expect) {
+ out.println(name + ": " + found);
+ if (!expect.matcher(found).matches()) {
+ error("Unexpected output; expected match for: " + expect);
+ }
+ }
+
void checkEmpty(String name, String found) {
out.println(name + ": " + found);
if (!found.isEmpty()) {
--- a/test/langtools/tools/javac/launcher/src/CLTest.java Wed Sep 26 18:36:55 2018 +0100
+++ b/test/langtools/tools/javac/launcher/src/CLTest.java Thu Sep 27 10:49:10 2018 -0700
@@ -43,38 +43,38 @@
import com.sun.tools.classfile.ClassFile;
public class CLTest {
- public static void main(String... args) throws Exception {
- try {
- new CLTest().run();
- } catch (Throwable t) {
- t.printStackTrace();
- System.exit(1);
- }
+ public static void main(String... args) throws Exception {
+ try {
+ new CLTest().run();
+ } catch (Throwable t) {
+ t.printStackTrace();
+ System.exit(1);
+ }
+ }
+
+ void run() throws Exception {
+ String[] names = {
+ "p/q/CLTest.class",
+ "p/q/CLTest$Inner.class",
+ "p/q/CLTest2.class",
+ "java/lang/Object.class",
+ "UNKNOWN.class",
+ "UNKNOWN"
+ };
+
+ for (String name : names) {
+ testGetResource(name);
+ testGetResources(name);
+ testGetResourceAsStream(name);
}
- void run() throws Exception {
- String[] names = {
- "p/q/CLTest.class",
- "p/q/CLTest$Inner.class",
- "p/q/CLTest2.class",
- "java/lang/Object.class",
- "UNKNOWN.class",
- "UNKNOWN"
- };
-
- for (String name : names) {
- testGetResource(name);
- testGetResources(name);
- testGetResourceAsStream(name);
- }
-
- if (errors > 0) {
- throw new Exception(errors + " errors found");
- }
+ if (errors > 0) {
+ throw new Exception(errors + " errors found");
}
+ }
void testGetResource(String name) {
- System.err.println("testGetResource: " + name);
+ System.err.println("testGetResource: " + name);
try {
ClassLoader cl = getClass().getClassLoader();
URL u = cl.getResource(name);
@@ -95,7 +95,7 @@
}
void testGetResources(String name) {
- System.err.println("testGetResources: " + name);
+ System.err.println("testGetResources: " + name);
try {
ClassLoader cl = getClass().getClassLoader();
Enumeration<URL> e = cl.getResources(name);
--- a/test/langtools/tools/javac/options/IsSupportedOptionTest.java Wed Sep 26 18:36:55 2018 +0100
+++ b/test/langtools/tools/javac/options/IsSupportedOptionTest.java Thu Sep 27 10:49:10 2018 -0700
@@ -23,7 +23,7 @@
/*
* @test
- * @bug 8189782
+ * @bug 8189782 8210555
* @summary Test for isSupportedOption
* @modules java.compiler
* jdk.compiler
@@ -44,6 +44,9 @@
public void run() throws Exception {
JavaCompiler tool = ToolProvider.getSystemJavaCompiler();
check(tool, "-source", 1);
+ check(tool, "--source", 1);
+ check(tool, "-target", 1);
+ check(tool, "--target", 1);
check(tool, "--add-modules", 1);
check(tool, "-verbose", 0);
check(tool, "-proc:none", 0);
--- a/test/langtools/tools/javadoc/api/basic/IsSupportedOptionTest.java Wed Sep 26 18:36:55 2018 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,69 +0,0 @@
-/*
- * Copyright (c) 2012, 2015, 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.
- */
-
-/*
- * @test
- * @bug 6493690
- * @summary javadoc should have a javax.tools.Tool service provider
- * @modules java.compiler
- * jdk.compiler
- * @build APITest
- * @run main IsSupportedOptionTest
- */
-
-import javax.tools.DocumentationTool;
-import javax.tools.ToolProvider;
-
-/**
- * Tests for DocumentationTool.usSupportedOption method.
- */
-public class IsSupportedOptionTest extends APITest {
- public static void main(String... args) throws Exception {
- new IsSupportedOptionTest().run();
- }
-
- /**
- * Verify that isSupportedOption method can be invoked.
- */
- @Test
- public void test() throws Exception {
- DocumentationTool tool = ToolProvider.getSystemDocumentationTool();
- check(tool, "-sourcepath", 1);
- check(tool, "-verbose", 0);
- check(tool, "-ZZZ", -1);
-
- try {
- check(tool, null, -1);
- error("null was accepted without exception");
- } catch (NullPointerException e) {
- }
- }
-
- private void check(DocumentationTool tool, String option, int numArgs) {
- System.err.println("check " + option);
- int n = tool.isSupportedOption(option);
- if (n != numArgs)
- error("unexpected result for option: " + option + ": " + n);
- }
-}
-
--- a/test/langtools/tools/javadoc/sourceOption/SourceOption.java Wed Sep 26 18:36:55 2018 +0100
+++ b/test/langtools/tools/javadoc/sourceOption/SourceOption.java Thu Sep 27 10:49:10 2018 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -33,25 +33,20 @@
*/
/*
- * TEST NOTE
- * With JDK9, this test has been transformed into a NEGATIVE test.
+ * In order to test whether or not the -source option is working
+ * correctly, this test tries to parse source code that contains
+ * a feature that is not available in at least one of the currently
+ * supported previous versions.
*
- * Generally speaking, this test should check a feature not in at least
- * one of the currently supported previous versions. In this manner,
- * a failure of the -source option to be honored would mean a pass of
- * the test, and therefore a failure of the -source option.
+ * Parsing such code should be expected to fail; if the action
+ * passes, that means the -source option is (incorrectly) ineffective.
*
- * For JDK9 and JDK10, both support 1.7, which did not support javac's
- * lambda construct. So we set "-source 1.7" to compile a .java file
- * containing the lambda construct. javac should fail, thus showing
- * -source to be working. Thus the test passes.
- *
- * The second jtreg @run command checks to make sure that the source
+ * Additional actions are performed to ensure that the source
* provided is valid for the current release of the JDK.
*
- * fixVersion: JDK11
- * replace ./p/LambdaConstructTest.java with a missing from
- * JDK8, JDK9, or JDK10. Set -source below appropriately.
+ * As support for older versions of the platform are dropped, the
+ * source code (currently p/LambdaConstructTest.java) will need to
+ * be updated with a more recent feature.
*/
import com.sun.javadoc.*;
--- a/test/lib/jdk/test/lib/artifacts/ArtifactResolver.java Wed Sep 26 18:36:55 2018 +0100
+++ b/test/lib/jdk/test/lib/artifacts/ArtifactResolver.java Thu Sep 27 10:49:10 2018 -0700
@@ -23,7 +23,6 @@
package jdk.test.lib.artifacts;
-import java.io.FileNotFoundException;
import java.nio.file.Path;
import java.util.HashMap;
import java.util.Map;
@@ -35,7 +34,7 @@
String managerName = System.getProperty("jdk.test.lib.artifacts.artifactmanager");
if (managerName != null) {
manager = (ArtifactManager) Class.forName(managerName).newInstance();
- } else {
+ } else if (System.getenv().containsKey(JibArtifactManager.JIB_HOME_ENV_NAME)) {
manager = JibArtifactManager.newInstance();
}
} catch (Exception e) {
--- a/test/lib/jdk/test/lib/artifacts/JibArtifactManager.java Wed Sep 26 18:36:55 2018 +0100
+++ b/test/lib/jdk/test/lib/artifacts/JibArtifactManager.java Thu Sep 27 10:49:10 2018 -0700
@@ -23,26 +23,66 @@
package jdk.test.lib.artifacts;
-import java.io.FileNotFoundException;
+import java.io.UncheckedIOException;
import java.lang.reflect.Method;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.nio.file.Files;
import java.nio.file.Path;
+import java.nio.file.Paths;
import java.util.HashMap;
import java.util.Map;
+import java.util.stream.Stream;
public class JibArtifactManager implements ArtifactManager {
private static final String JIB_SERVICE_FACTORY = "com.oracle.jib.api.JibServiceFactory";
+ public static final String JIB_HOME_ENV_NAME = "JIB_HOME";
private static String jibVersion = "1.0";
- private Object installerObject;
- private JibArtifactManager(Object o) {
- installerObject = o;
+ private Object installerObject;
+ private ClassLoader classLoader;
+
+ private JibArtifactManager(Object installerObject, ClassLoader classLoader) {
+ this.installerObject = installerObject;
+ this.classLoader = classLoader;
}
public static JibArtifactManager newInstance() throws ClassNotFoundException {
+ Path jibInstallDir = Paths.get(System.getenv(JIB_HOME_ENV_NAME));
+ Path libDir = jibInstallDir.resolve("lib");
+ if (!Files.isDirectory(libDir)) {
+ throw new ClassNotFoundException(JIB_SERVICE_FACTORY);
+ }
try {
- Class jibServiceFactory = Class.forName(JIB_SERVICE_FACTORY);
- Object jibArtifactInstaller = jibServiceFactory.getMethod("createJibArtifactInstaller").invoke(null);
- return new JibArtifactManager(jibArtifactInstaller);
+ URL[] jarUrls;
+ try (Stream<Path> files = Files.list(libDir)) {
+ jarUrls = files.filter(path -> path.toString().endsWith(".jar"))
+ .map(path -> {
+ try {
+ return path.toUri().toURL();
+ } catch (MalformedURLException e) {
+ throw new UncheckedIOException(e);
+ }
+ }).toArray(URL[]::new);
+ }
+ // Create a class loader using all those jars and set the parent to the
+ // current class loader's parent.
+ ClassLoader classLoader = new URLClassLoader(jarUrls, JibArtifactManager.class.getClassLoader().getParent());
+
+ // Temporarily replace the context classLoader
+ Thread currentThread = Thread.currentThread();
+ ClassLoader oldContextLoader = currentThread.getContextClassLoader();
+ currentThread.setContextClassLoader(classLoader);
+
+ Class jibServiceFactory = classLoader.loadClass(JIB_SERVICE_FACTORY);
+ try {
+ Object jibArtifactInstaller = jibServiceFactory.getMethod("createJibArtifactInstaller").invoke(null);
+ return new JibArtifactManager(jibArtifactInstaller, classLoader);
+ } finally {
+ currentThread.setContextClassLoader(oldContextLoader);
+ }
+
} catch (Exception e) {
throw new ClassNotFoundException(JIB_SERVICE_FACTORY, e);
}
@@ -56,9 +96,19 @@
return invokeInstallerMethod("install", jibVersion, artifactDescription);
}
- private Path invokeInstallerMethod(String methodName, String jibVersion, HashMap<String, Object> artifactDescription) throws Exception {
- Method m = Class.forName("com.oracle.jib.api.JibArtifactInstaller").getMethod(methodName, String.class, Map.class);
- return (Path)m.invoke(installerObject, jibVersion, artifactDescription);
+ private Path invokeInstallerMethod(String methodName, String jibVersion,
+ HashMap<String, Object> artifactDescription) throws Exception {
+ // Temporarily replace the context classLoader
+ Thread currentThread = Thread.currentThread();
+ ClassLoader oldContextLoader = currentThread.getContextClassLoader();
+ currentThread.setContextClassLoader(classLoader);
+ try {
+ Method m = classLoader.loadClass("com.oracle.jib.api.JibArtifactInstaller")
+ .getMethod(methodName, String.class, Map.class);
+ return (Path) m.invoke(installerObject, jibVersion, artifactDescription);
+ } finally {
+ currentThread.setContextClassLoader(oldContextLoader);
+ }
}
@Override
@@ -89,5 +139,5 @@
}
}
return path;
- }
+ }
}
--- a/test/lib/jdk/test/lib/jfr/EventNames.java Wed Sep 26 18:36:55 2018 +0100
+++ b/test/lib/jdk/test/lib/jfr/EventNames.java Thu Sep 27 10:49:10 2018 -0700
@@ -128,6 +128,7 @@
public final static String G1EvacuationOldStatistics = PREFIX + "G1EvacuationOldStatistics";
public final static String G1BasicIHOP = PREFIX + "G1BasicIHOP";
public final static String AllocationRequiringGC = PREFIX + "AllocationRequiringGC";
+ public final static String GCPhaseParallel = PREFIX + "GCPhaseParallel";
// Compiler
public final static String Compilation = PREFIX + "Compilation";