# HG changeset patch # User prr # Date 1538070550 25200 # Node ID d3e0d57cd3ffc1fb7130122818874c9857fc5546 # Parent c3fc25df8f5ac551d411a1d5388d6ca8cf9b6440# Parent 11fd6c8188d9efd0f1c7e9cd05a36ce3dbbd03a9 Merge diff -r c3fc25df8f5a -r d3e0d57cd3ff .hgtags --- 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 diff -r c3fc25df8f5a -r d3e0d57cd3ff make/RunTests.gmk --- 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 diff -r c3fc25df8f5a -r d3e0d57cd3ff make/autoconf/spec.gmk.in --- 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@ diff -r c3fc25df8f5a -r d3e0d57cd3ff make/autoconf/toolchain.m4 --- 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) ]) diff -r c3fc25df8f5a -r d3e0d57cd3ff make/conf/jib-profiles.js --- 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: { diff -r c3fc25df8f5a -r d3e0d57cd3ff make/devkit/createSolarisDevkit12.6.sh --- 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 diff -r c3fc25df8f5a -r d3e0d57cd3ff make/launcher/LauncherCommon.gmk --- 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) diff -r c3fc25df8f5a -r d3e0d57cd3ff make/lib/CoreLibraries.gmk --- 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)) diff -r c3fc25df8f5a -r d3e0d57cd3ff make/lib/LibCommon.gmk --- 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 diff -r c3fc25df8f5a -r d3e0d57cd3ff src/hotspot/cpu/aarch64/c1_LIRAssembler_aarch64.cpp --- 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()); diff -r c3fc25df8f5a -r d3e0d57cd3ff src/hotspot/cpu/aarch64/c1_LIRAssembler_aarch64.hpp --- 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); diff -r c3fc25df8f5a -r d3e0d57cd3ff src/hotspot/cpu/aarch64/c1_LIRGenerator_aarch64.cpp --- 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) { diff -r c3fc25df8f5a -r d3e0d57cd3ff src/hotspot/cpu/aarch64/macroAssembler_aarch64.cpp --- 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()); diff -r c3fc25df8f5a -r d3e0d57cd3ff src/hotspot/cpu/aarch64/macroAssembler_aarch64.hpp --- 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); diff -r c3fc25df8f5a -r d3e0d57cd3ff src/hotspot/cpu/aarch64/sharedRuntime_aarch64.cpp --- 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; diff -r c3fc25df8f5a -r d3e0d57cd3ff src/hotspot/cpu/aarch64/templateInterpreterGenerator_aarch64.cpp --- 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; diff -r c3fc25df8f5a -r d3e0d57cd3ff src/hotspot/cpu/arm/c1_LIRAssembler_arm.cpp --- 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"); diff -r c3fc25df8f5a -r d3e0d57cd3ff src/hotspot/cpu/ppc/c1_LIRAssembler_ppc.cpp --- 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()) { diff -r c3fc25df8f5a -r d3e0d57cd3ff src/hotspot/cpu/s390/c1_LIRAssembler_s390.cpp --- 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()) { diff -r c3fc25df8f5a -r d3e0d57cd3ff src/hotspot/cpu/sparc/c1_LIRAssembler_sparc.cpp --- 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()) { diff -r c3fc25df8f5a -r d3e0d57cd3ff src/hotspot/cpu/x86/assembler_x86.cpp --- 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)); diff -r c3fc25df8f5a -r d3e0d57cd3ff src/hotspot/cpu/x86/assembler_x86.hpp --- 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); diff -r c3fc25df8f5a -r d3e0d57cd3ff src/hotspot/cpu/x86/c1_LIRAssembler_x86.cpp --- 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)); } diff -r c3fc25df8f5a -r d3e0d57cd3ff src/hotspot/cpu/x86/c1_LIRGenerator_x86.cpp --- 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(); } diff -r c3fc25df8f5a -r d3e0d57cd3ff src/hotspot/cpu/x86/globals_x86.hpp --- 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) \ \ diff -r c3fc25df8f5a -r d3e0d57cd3ff src/hotspot/cpu/x86/macroAssembler_x86.cpp --- 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); diff -r c3fc25df8f5a -r d3e0d57cd3ff src/hotspot/cpu/x86/macroAssembler_x86.hpp --- 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); diff -r c3fc25df8f5a -r d3e0d57cd3ff src/hotspot/cpu/x86/vm_version_x86.cpp --- 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); } diff -r c3fc25df8f5a -r d3e0d57cd3ff src/hotspot/cpu/x86/vm_version_x86.hpp --- 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()); } diff -r c3fc25df8f5a -r d3e0d57cd3ff src/hotspot/cpu/x86/x86.ad --- 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 %{ diff -r c3fc25df8f5a -r d3e0d57cd3ff src/hotspot/cpu/x86/x86_32.ad --- 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); diff -r c3fc25df8f5a -r d3e0d57cd3ff src/hotspot/cpu/x86/x86_64.ad --- 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); diff -r c3fc25df8f5a -r d3e0d57cd3ff src/hotspot/share/c1/c1_LIR.cpp --- 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; diff -r c3fc25df8f5a -r d3e0d57cd3ff src/hotspot/share/c1/c1_LIR.hpp --- 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)); } diff -r c3fc25df8f5a -r d3e0d57cd3ff src/hotspot/share/c1/c1_LIRAssembler.cpp --- 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: diff -r c3fc25df8f5a -r d3e0d57cd3ff src/hotspot/share/c1/c1_LIRAssembler.hpp --- 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); diff -r c3fc25df8f5a -r d3e0d57cd3ff src/hotspot/share/classfile/classLoaderData.cpp --- 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); diff -r c3fc25df8f5a -r d3e0d57cd3ff src/hotspot/share/code/dependencyContext.cpp --- 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; diff -r c3fc25df8f5a -r d3e0d57cd3ff src/hotspot/share/code/dependencyContext.hpp --- 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); diff -r c3fc25df8f5a -r d3e0d57cd3ff src/hotspot/share/gc/g1/g1CollectedHeap.cpp --- 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; } diff -r c3fc25df8f5a -r d3e0d57cd3ff src/hotspot/share/gc/g1/g1GCPhaseTimes.cpp --- 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)); } } diff -r c3fc25df8f5a -r d3e0d57cd3ff src/hotspot/share/gc/g1/g1GCPhaseTimes.hpp --- 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(); diff -r c3fc25df8f5a -r d3e0d57cd3ff src/hotspot/share/gc/g1/g1RemSet.cpp --- 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) { diff -r c3fc25df8f5a -r d3e0d57cd3ff src/hotspot/share/gc/shared/c2/barrierSetC2.cpp --- 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; } diff -r c3fc25df8f5a -r d3e0d57cd3ff src/hotspot/share/gc/shared/c2/barrierSetC2.hpp --- 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(type)) {} const TypePtr* type() const { return reinterpret_cast(_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. diff -r c3fc25df8f5a -r d3e0d57cd3ff src/hotspot/share/jfr/metadata/metadata.xml --- 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 @@ + + + + + + diff -r c3fc25df8f5a -r d3e0d57cd3ff src/hotspot/share/oops/instanceKlass.cpp --- 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 diff -r c3fc25df8f5a -r d3e0d57cd3ff src/hotspot/share/oops/instanceKlass.hpp --- 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 diff -r c3fc25df8f5a -r d3e0d57cd3ff src/hotspot/share/opto/graphKit.cpp --- 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 diff -r c3fc25df8f5a -r d3e0d57cd3ff src/hotspot/share/opto/graphKit.hpp --- 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); diff -r c3fc25df8f5a -r d3e0d57cd3ff src/hotspot/share/opto/library_call.cpp --- 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) { diff -r c3fc25df8f5a -r d3e0d57cd3ff src/hotspot/share/opto/parse2.cpp --- 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); } diff -r c3fc25df8f5a -r d3e0d57cd3ff src/hotspot/share/opto/parse3.cpp --- 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; diff -r c3fc25df8f5a -r d3e0d57cd3ff src/hotspot/share/opto/parseHelper.cpp --- 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----------------------------- diff -r c3fc25df8f5a -r d3e0d57cd3ff src/hotspot/share/opto/stringopts.cpp --- 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 diff -r c3fc25df8f5a -r d3e0d57cd3ff src/hotspot/share/opto/subnode.cpp --- 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. diff -r c3fc25df8f5a -r d3e0d57cd3ff src/hotspot/share/runtime/arguments.cpp --- 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() }, diff -r c3fc25df8f5a -r d3e0d57cd3ff src/hotspot/share/runtime/globals.hpp --- 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) \ \ diff -r c3fc25df8f5a -r d3e0d57cd3ff src/hotspot/share/runtime/objectMonitor.cpp --- 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 = 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; } diff -r c3fc25df8f5a -r d3e0d57cd3ff src/hotspot/share/runtime/objectMonitor.hpp --- 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(); diff -r c3fc25df8f5a -r d3e0d57cd3ff src/hotspot/share/runtime/safepoint.cpp --- 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); diff -r c3fc25df8f5a -r d3e0d57cd3ff src/hotspot/share/runtime/sweeper.cpp --- 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; } } diff -r c3fc25df8f5a -r d3e0d57cd3ff src/hotspot/share/runtime/sweeper.hpp --- 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(); diff -r c3fc25df8f5a -r d3e0d57cd3ff src/hotspot/share/runtime/synchronizer.cpp --- 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); } } diff -r c3fc25df8f5a -r d3e0d57cd3ff src/hotspot/share/runtime/synchronizer.hpp --- 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); diff -r c3fc25df8f5a -r d3e0d57cd3ff src/hotspot/share/runtime/thread.cpp --- 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. diff -r c3fc25df8f5a -r d3e0d57cd3ff src/hotspot/share/runtime/vframe.cpp --- 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; } diff -r c3fc25df8f5a -r d3e0d57cd3ff src/hotspot/share/runtime/vm_version.cpp --- 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 diff -r c3fc25df8f5a -r d3e0d57cd3ff src/java.base/share/classes/java/time/format/DateTimeFormatterBuilder.java --- 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> getTextIterator(TemporalField field, TextStyle style, Locale locale) { + public Iterator> getTextIterator(Chronology chrono, + TemporalField field, TextStyle style, Locale locale) { + return store.getTextIterator(style); + } + @Override + public Iterator> getTextIterator(TemporalField field, + TextStyle style, Locale locale) { return store.getTextIterator(style); } }; diff -r c3fc25df8f5a -r d3e0d57cd3ff src/java.base/share/classes/java/util/Arrays.java --- 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}. + * + *

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}. + * + *

This method provides a way to wrap an existing array: + *

{@code
+     *     Integer[] numbers = ...
+     *     ...
+     *     List values = Arrays.asList(numbers);
+     * }
* *

This method also provides a convenient way to create a fixed-size * list initialized to contain several elements: - *

-     *     List<String> stooges = Arrays.asList("Larry", "Moe", "Curly");
-     * 
+ *
{@code
+     *     List stooges = Arrays.asList("Larry", "Moe", "Curly");
+     * }
+ * + *

The list returned by this method is modifiable. + * To create an unmodifiable list, use + * {@link Collections#unmodifiableList Collections.unmodifiableList} + * or Unmodifiable Lists. * * @param 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") diff -r c3fc25df8f5a -r d3e0d57cd3ff src/java.base/share/classes/java/util/jar/Attributes.java --- 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; } /** diff -r c3fc25df8f5a -r d3e0d57cd3ff src/java.base/share/classes/java/util/jar/JarFile.java --- 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); } diff -r c3fc25df8f5a -r d3e0d57cd3ff src/java.base/share/classes/java/util/jar/Manifest.java --- 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 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, diff -r c3fc25df8f5a -r d3e0d57cd3ff src/java.base/share/classes/java/util/stream/Collectors.java --- 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. + * + *

The resulting collector functions do the following: + * + *

    + *
  • supplier: creates a result container that contains result containers + * obtained by calling each collector's supplier + *
  • accumulator: calls each collector's accumulator with its result container + * and the input element + *
  • combiner: calls each collector's combiner with two result containers + *
  • finisher: calls each collector's finisher with its result container, + * then calls the supplied merger and returns its result. + *
+ * + *

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 the type of the input elements + * @param the result type of the first collector + * @param the result type of the second collector + * @param 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 + Collector teeing(Collector downstream1, + Collector downstream2, + BiFunction merger) { + return teeing0(downstream1, downstream2, merger); + } + + private static + Collector teeing0(Collector downstream1, + Collector downstream2, + BiFunction merger) { + Objects.requireNonNull(downstream1, "downstream1"); + Objects.requireNonNull(downstream2, "downstream2"); + Objects.requireNonNull(merger, "merger"); + + Supplier c1Supplier = Objects.requireNonNull(downstream1.supplier(), "downstream1 supplier"); + Supplier c2Supplier = Objects.requireNonNull(downstream2.supplier(), "downstream2 supplier"); + BiConsumer c1Accumulator = + Objects.requireNonNull(downstream1.accumulator(), "downstream1 accumulator"); + BiConsumer c2Accumulator = + Objects.requireNonNull(downstream2.accumulator(), "downstream2 accumulator"); + BinaryOperator c1Combiner = Objects.requireNonNull(downstream1.combiner(), "downstream1 combiner"); + BinaryOperator c2Combiner = Objects.requireNonNull(downstream2.combiner(), "downstream2 combiner"); + Function c1Finisher = Objects.requireNonNull(downstream1.finisher(), "downstream1 finisher"); + Function c2Finisher = Objects.requireNonNull(downstream2.finisher(), "downstream2 finisher"); + + Set characteristics; + Set c1Characteristics = downstream1.characteristics(); + Set c2Characteristics = downstream2.characteristics(); + if (CH_ID.containsAll(c1Characteristics) || CH_ID.containsAll(c2Characteristics)) { + characteristics = CH_NOID; + } else { + EnumSet 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 diff -r c3fc25df8f5a -r d3e0d57cd3ff src/java.base/share/classes/sun/net/util/SocketExceptions.java --- 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() { - 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. */ diff -r c3fc25df8f5a -r d3e0d57cd3ff src/java.base/share/classes/sun/security/util/SecurityProperties.java --- /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 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; + } +} diff -r c3fc25df8f5a -r d3e0d57cd3ff src/java.base/share/conf/security/java.security --- 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 diff -r c3fc25df8f5a -r d3e0d57cd3ff src/java.base/unix/native/libnet/net_util_md.h --- 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 diff -r c3fc25df8f5a -r d3e0d57cd3ff src/java.base/unix/native/libnio/ch/NativeThread.c --- 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 /* Also defined in net/linux_close.c */ #define INTERRUPT_SIGNAL (__SIGRTMAX - 2) -#elif _AIX +#elif defined(_AIX) #include /* Also defined in net/aix_close.c */ #define INTERRUPT_SIGNAL (SIGRTMAX - 1) -#elif __solaris__ +#elif defined(__solaris__) #include #define INTERRUPT_SIGNAL (SIGRTMAX - 2) -#elif _ALLBSD_SOURCE +#elif defined(_ALLBSD_SOURCE) #include /* Also defined in net/bsd_close.c */ #define INTERRUPT_SIGNAL SIGIO diff -r c3fc25df8f5a -r d3e0d57cd3ff src/java.base/unix/native/libnio/ch/nio_util.h --- 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 diff -r c3fc25df8f5a -r d3e0d57cd3ff src/java.desktop/macosx/native/libosxapp/AWT_debug.h --- 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 -bool ShouldPrintVerboseDebugging(); +JNIEXPORT bool ShouldPrintVerboseDebugging(); #define kInternalError "java/lang/InternalError" diff -r c3fc25df8f5a -r d3e0d57cd3ff src/java.desktop/macosx/native/libosxapp/NSApplicationAWT.h --- 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 #import -@interface NSApplicationAWT : NSApplication { +JNIEXPORT @interface NSApplicationAWT : NSApplication { NSString *fApplicationName; NSWindow *eventTransparentWindow; NSTimeInterval dummyEventTimestamp; @@ -57,5 +57,5 @@ @end -void OSXAPP_SetApplicationDelegate(id delegate); +JNIEXPORT void OSXAPP_SetApplicationDelegate(id delegate); diff -r c3fc25df8f5a -r d3e0d57cd3ff src/java.desktop/macosx/native/libosxapp/PropertiesUtilities.h --- 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 #import -@interface PropertiesUtilities : NSObject +JNIEXPORT @interface PropertiesUtilities : NSObject + (NSString *) javaSystemPropertyForKey:(NSString *)key withEnv:(JNIEnv *)env; diff -r c3fc25df8f5a -r d3e0d57cd3ff src/java.desktop/macosx/native/libosxapp/ThreadUtilities.h --- 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 #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 */ diff -r c3fc25df8f5a -r d3e0d57cd3ff src/jdk.compiler/share/classes/com/sun/tools/javac/code/Flags.java --- 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; diff -r c3fc25df8f5a -r d3e0d57cd3ff src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Analyzer.java --- 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; diff -r c3fc25df8f5a -r d3e0d57cd3ff src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java --- 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 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; - } } } // diff -r c3fc25df8f5a -r d3e0d57cd3ff src/jdk.compiler/share/classes/com/sun/tools/javac/launcher/Main.java --- 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 inMemoryClasses = new HashMap<>(); + private final Path file; + private final Map 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}. * - *

The classloader uses the standard parent-delegation model, just providing - * {@code findClass} to find classes in the in-memory cache. + *

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 map; + private final Map 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 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 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 getResources(String name) throws IOException { + URL u = findResource(name); + Enumeration e = getParent().getResources(name); + if (u == null) { + return e; + } else { + List 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()))); } } diff -r c3fc25df8f5a -r d3e0d57cd3ff src/jdk.compiler/share/classes/com/sun/tools/javac/main/Option.java --- 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); diff -r c3fc25df8f5a -r d3e0d57cd3ff src/jdk.compiler/share/classes/com/sun/tools/javac/resources/launcher.properties --- 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} diff -r c3fc25df8f5a -r d3e0d57cd3ff src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/Start.java --- 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()); diff -r c3fc25df8f5a -r d3e0d57cd3ff src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/ToolOption.java --- 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); } }, diff -r c3fc25df8f5a -r d3e0d57cd3ff src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlConfiguration.java --- 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 doclintOpts = new LinkedHashMap<>(); @@ -840,13 +834,6 @@ } return true; } - }, - new XOption(resources, "--no-module-directories") { - @Override - public boolean process(String option, List args) { - useModuleDirectories = false; - return true; - } } }; Set oset = new TreeSet<>(); diff -r c3fc25df8f5a -r d3e0d57cd3ff src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDocletWriter.java --- 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 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 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 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 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 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 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 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); } diff -r c3fc25df8f5a -r d3e0d57cd3ff src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/LinkFactoryImpl.java --- 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); diff -r c3fc25df8f5a -r d3e0d57cd3ff src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ModuleWriterImpl.java --- 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)); } }); } diff -r c3fc25df8f5a -r d3e0d57cd3ff src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/TagletWriterImpl.java --- 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() { - @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() { + @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 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 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 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 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 tags, boolean isFirstSentence) { return htmlWriter.commentTagsToContent(holderTag, holder, - tags, isFirstSentence); + tags, isFirstSentence, inSummary); } /** diff -r c3fc25df8f5a -r d3e0d57cd3ff src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/Navigation.java --- 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 { diff -r c3fc25df8f5a -r d3e0d57cd3ff src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/BaseConfiguration.java --- 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> 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 args) { + useModuleDirectories = false; + return true; + } + } }; Set set = new TreeSet<>(); set.addAll(Arrays.asList(options)); diff -r c3fc25df8f5a -r d3e0d57cd3ff src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/doclets.properties --- 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\ -

\n\
- for ({0} c : {0}.values())\n\
-     System.out.println(c);\n\
- 
+ 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 diff -r c3fc25df8f5a -r d3e0d57cd3ff src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/Extern.java --- 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 elementToItemMap; + private Map moduleItems = new HashMap<>(); + private Map> 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 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); + } + } } diff -r c3fc25df8f5a -r d3e0d57cd3ff src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/ToolOption.java --- 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); diff -r c3fc25df8f5a -r d3e0d57cd3ff src/jdk.jdwp.agent/unix/native/libjdwp/util_md.h --- 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 #ifdef _ALLBSD_SOURCE #include -#elif __linux__ +#elif defined(__linux__) #include #endif diff -r c3fc25df8f5a -r d3e0d57cd3ff src/jdk.jfr/share/conf/jfr/default.jfc --- 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 @@ true
+ + true + 0 ms + + true diff -r c3fc25df8f5a -r d3e0d57cd3ff src/jdk.jfr/share/conf/jfr/profile.jfc --- 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 @@ true + + true + 0 ms + + true diff -r c3fc25df8f5a -r d3e0d57cd3ff src/jdk.unsupported/share/classes/sun/reflect/ReflectionFactory.java --- 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 diff -r c3fc25df8f5a -r d3e0d57cd3ff test/TestCommon.gmk --- 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" diff -r c3fc25df8f5a -r d3e0d57cd3ff test/hotspot/gtest/code/test_dependencyContext.cpp --- 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) { diff -r c3fc25df8f5a -r d3e0d57cd3ff test/hotspot/jtreg/ProblemList-graal.txt --- 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 diff -r c3fc25df8f5a -r d3e0d57cd3ff test/hotspot/jtreg/ProblemList.txt --- 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 ############################################################################# diff -r c3fc25df8f5a -r d3e0d57cd3ff test/hotspot/jtreg/compiler/graalunit/CoreTest.java --- 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 / diff -r c3fc25df8f5a -r d3e0d57cd3ff test/hotspot/jtreg/compiler/graalunit/TestPackages.txt --- 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 diff -r c3fc25df8f5a -r d3e0d57cd3ff test/hotspot/jtreg/runtime/CommandLine/VMDeprecatedOptions.java --- 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"}, diff -r c3fc25df8f5a -r d3e0d57cd3ff test/hotspot/jtreg/runtime/appcds/GraalWithLimitedMetaspace.java --- 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(); diff -r c3fc25df8f5a -r d3e0d57cd3ff test/hotspot/jtreg/runtime/appcds/TestCommon.java --- 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"); } diff -r c3fc25df8f5a -r d3e0d57cd3ff test/hotspot/jtreg/runtime/appcds/sharedStrings/SharedStringsBasic.java --- 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); } diff -r c3fc25df8f5a -r d3e0d57cd3ff test/hotspot/jtreg/runtime/appcds/sharedStrings/SysDictCrash.java --- 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")); } diff -r c3fc25df8f5a -r d3e0d57cd3ff test/hotspot/jtreg/vmTestbase/nsk/jvmti/Breakpoint/breakpoint001/breakpoint001.cpp --- 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; iDetachCurrentThread()) != 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) diff -r c3fc25df8f5a -r d3e0d57cd3ff test/hotspot/jtreg/vmTestbase/nsk/jvmti/GetLocalVariableTable/localtab004/localtab004.cpp --- 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>> 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; jRedefineClasses(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; } } diff -r c3fc25df8f5a -r d3e0d57cd3ff test/hotspot/jtreg/vmTestbase/nsk/jvmti/RedefineClasses/redefclass004/redefclass004.cpp --- 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; } diff -r c3fc25df8f5a -r d3e0d57cd3ff test/hotspot/jtreg/vmTestbase/nsk/jvmti/RedefineClasses/redefclass008/redefclass008.cpp --- 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; } diff -r c3fc25df8f5a -r d3e0d57cd3ff test/hotspot/jtreg/vmTestbase/nsk/jvmti/RedefineClasses/redefclass009/redefclass009.cpp --- 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; kDetachCurrentThread()) != 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) { diff -r c3fc25df8f5a -r d3e0d57cd3ff test/hotspot/jtreg/vmTestbase/nsk/jvmti/SetJNIFunctionTable/setjniftab002/setjniftab002.cpp --- 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) diff -r c3fc25df8f5a -r d3e0d57cd3ff test/hotspot/jtreg/vmTestbase/nsk/jvmti/SingleStep/singlestep001/singlestep001.cpp --- 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))) { diff -r c3fc25df8f5a -r d3e0d57cd3ff test/hotspot/jtreg/vmTestbase/nsk/jvmti/SingleStep/singlestep002/singlestep002.cpp --- 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); diff -r c3fc25df8f5a -r d3e0d57cd3ff test/hotspot/jtreg/vmTestbase/nsk/jvmti/SingleStep/singlestep003/singlestep003.cpp --- 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)) { diff -r c3fc25df8f5a -r d3e0d57cd3ff test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/allocation/AP01/ap01t001/ap01t001.cpp --- 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); } diff -r c3fc25df8f5a -r d3e0d57cd3ff test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/allocation/AP02/ap02t001/ap02t001.cpp --- 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); diff -r c3fc25df8f5a -r d3e0d57cd3ff test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/allocation/AP03/ap03t001/ap03t001.cpp --- 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); } diff -r c3fc25df8f5a -r d3e0d57cd3ff test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/allocation/AP10/ap10t001/ap10t001.cpp --- 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); } } diff -r c3fc25df8f5a -r d3e0d57cd3ff test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/allocation/AP12/ap12t001/ap12t001.cpp --- 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); } diff -r c3fc25df8f5a -r d3e0d57cd3ff test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/hotswap/HS201/hs201t003/hs201t003.cpp --- 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))) diff -r c3fc25df8f5a -r d3e0d57cd3ff test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/jni_interception/JI05/ji05t001/ji05t001.cpp --- 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; iFatalError("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"); diff -r c3fc25df8f5a -r d3e0d57cd3ff test/hotspot/jtreg/vmTestbase/nsk/share/JVMTIagent.cpp --- 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\ -\tsignature=%s\n", - shortTestName, cls_sig); + display(0, + "#### JVMTIagent: found test class matched with \"%s\"\n" + "\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\ -\tHotSwap stress level: %d\n", - stress_lev); + display(0, + "#### JVMTIagent: hotswapping class in every method entry event enabled ####\n" + "\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\ -\tHotSwap stress level: %d\n", - stress_lev); + display(0, + "#### JVMTIagent: hotswapping class in every method entry event for every class enabled ####\n" + "\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\ -\tHotSwap stress level: %d\n", - stress_lev); + display(0, + "#### JVMTIagent: hotswapping class in every single step event enabled ####\n" + "\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\ -\tHotSwap stress level: %d\n", - stress_lev); + display(0, + "#### JVMTIagent: hotswapping class in every exception event enabled ####\n" + "\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\ -\tHotSwap stress level: %d\n", - stress_lev); + display(0, + "#### JVMTIagent: hotswapping class in every exception event for every class enabled ####\n" + "\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\ -\tnew class byte count=%d\n", - classDef.class_byte_count); + display(0, + "#### JVMTIagent: >>>>>>>> Invoke RedefineClasses():\n" + "\tnew class byte count=%d\n", + classDef.class_byte_count); if (!NSK_JVMTI_VERIFY(NSK_CPP_STUB3(RedefineClasses, jvmti, 1, &classDef))) return 1; diff -r c3fc25df8f5a -r d3e0d57cd3ff test/hotspot/jtreg/vmTestbase/nsk/share/aod/aod.cpp --- 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); diff -r c3fc25df8f5a -r d3e0d57cd3ff test/jdk/ProblemList.txt --- 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 diff -r c3fc25df8f5a -r d3e0d57cd3ff test/jdk/TEST.groups --- 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 diff -r c3fc25df8f5a -r d3e0d57cd3ff test/jdk/java/time/test/java/time/format/TestDateTimeFormatterBuilderWithLocale.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 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); } diff -r c3fc25df8f5a -r d3e0d57cd3ff test/jdk/java/util/Locale/Bug7069824.java --- 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>() { + { + 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 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 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 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 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 expected, - List 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 priorityList, + Map> map, List 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 priorityList = LanguageRange.parse(ranges); - HashMap> map = null; - - try { - List 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 list = - LanguageRange.mapEquivalents(priorityList, map); - } - catch (Exception ex) { - error = true; - System.err.println(ex - + " should not be thrown for mapEquivalents(priorityList, empty map)."); - } - - ArrayList equivalentList = new ArrayList<>(); - equivalentList.add("ja"); - equivalentList.add("ja-Hira"); - map.put("ja", equivalentList); - try { - List 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 equivalentList1 = new ArrayList<>(); - equivalentList1.add("ja"); - equivalentList1.add("ja-Hira"); - map.put("ja", equivalentList1); - ArrayList equivalentList2 = new ArrayList<>(); - equivalentList2.add("zh-Hans"); - equivalentList2.add("zh-Hans-CN"); - equivalentList2.add("zh-CN"); - map.put("zh", equivalentList2); - ArrayList equivalentList3 = new ArrayList<>(); - equivalentList3.add("zh-TW"); - equivalentList3.add("zh-Hant"); - map.put("zh-TW", equivalentList3); - map.put("es", null); - ArrayList equivalentList4 = new ArrayList<>(); - map.put("en", equivalentList4); - ArrayList equivalentList5 = new ArrayList<>(); - equivalentList5.add("de"); - map.put("zh-HK", equivalentList5); - - ArrayList 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 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 priorityList = LanguageRange.parse(ranges); List 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 priorityList = LanguageRange.parse(ranges); + List 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 priorityList = LanguageRange.parse(ranges); + List 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 priorityList = LanguageRange.parse(ranges); List 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 priorityList = LanguageRange.parse(ranges); List 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 priorityList = LanguageRange.parse(ranges); List 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 generateLocales(String tags) { @@ -950,28 +423,6 @@ return tagList; } - private static String showPriorityList(List priorityList) { - StringBuilder sb = new StringBuilder(); - - Iterator 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 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; } - } diff -r c3fc25df8f5a -r d3e0d57cd3ff test/jdk/java/util/Locale/FilteringModeTest.java --- /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 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 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); + } + } +} diff -r c3fc25df8f5a -r d3e0d57cd3ff test/jdk/java/util/stream/test/org/openjdk/tests/java/util/stream/CollectorsTest.java --- 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> 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> 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 extends CollectorAssertion { + private final Collector c1; + private final Collector c2; + private final BiFunction finisher; + + TeeingAssertion(Collector c1, Collector c2, + BiFunction finisher) { + this.c1 = c1; + this.c2 = c2; + this.finisher = finisher; + } + + @Override + void assertValue(RR value, Supplier> 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 ResultAsserter mapTabulationAsserter(boolean ordered) { return (act, exp, ord, par) -> { if (par && (!ordered || !ord)) { @@ -746,4 +769,42 @@ catch (UnsupportedOperationException ignored) { } } + @Test(dataProvider = "StreamTestData", dataProviderClass = StreamTestDataProvider.class) + public void testTeeing(String name, TestData.OfRef data) throws ReflectiveOperationException { + Collector summing = Collectors.summingLong(Integer::valueOf); + Collector counting = Collectors.counting(); + Collector min = collectingAndThen(Collectors.minBy(Comparator.naturalOrder()), + opt -> opt.orElse(Integer.MAX_VALUE)); + Collector max = collectingAndThen(Collectors.maxBy(Comparator.naturalOrder()), + opt -> opt.orElse(Integer.MIN_VALUE)); + Collector joining = mapping(String::valueOf, Collectors.joining(", ", "[", "]")); + + Collector> sumAndCount = Collectors.teeing(summing, counting, Map::entry); + Collector> minAndMax = Collectors.teeing(min, max, Map::entry); + Collector averaging = Collectors.teeing(summing, counting, + (sum, count) -> ((double)sum) / count); + Collector summaryStatistics = Collectors.teeing(sumAndCount, minAndMax, + (sumCountEntry, minMaxEntry) -> new IntSummaryStatistics( + sumCountEntry.getValue(), minMaxEntry.getKey(), + minMaxEntry.getValue(), sumCountEntry.getKey()).toString()); + Collector countAndContent = Collectors.teeing(counting, joining, + (count, content) -> count+": "+content); + + assertCollect(data, sumAndCount, stream -> { + List 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 list = stream.collect(toList()); + return list.size()+": "+list; + }); + + Function classifier = i -> i % 3; + exerciseMapCollection(data, groupingBy(classifier, sumAndCount), + new GroupingByAssertion<>(classifier, Map.class, + new TeeingAssertion<>(summing, counting, Map::entry))); + } } diff -r c3fc25df8f5a -r d3e0d57cd3ff test/jdk/jdk/jfr/event/gc/collection/TestG1ParallelPhases.java --- /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> 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 usedPhases = fromRecording(recording).stream() + .map(e -> e.getValue("name").toString()) + .collect(toSet()); + + Set 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 liveOldObjects, + int g1HeapRegionSize, + int arraySize) { + + var toUnreachable = new ArrayList(); + + // 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(); + 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"); + } +} diff -r c3fc25df8f5a -r d3e0d57cd3ff test/jdk/sanity/client/SwingSet/src/FrameDemoTest.java --- /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 diff -r c3fc25df8f5a -r d3e0d57cd3ff test/jdk/sanity/client/SwingSet/src/InternalFrameDemoTest.java --- 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()); diff -r c3fc25df8f5a -r d3e0d57cd3ff test/jdk/sanity/client/SwingSet/src/TestHelpers.java --- 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 diff -r c3fc25df8f5a -r d3e0d57cd3ff test/jdk/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/frame/BusyGlass.java --- /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: + *

+ *    // Install glasspane
+ *    frame.setGlassPane(new BusyGlass());
+ *
+ *    // Make frame busy
+ *    frame.getGlassPane().setVisible(true);
+ * 
+ * + * 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 + */ +//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()); + } +} +// \ No newline at end of file diff -r c3fc25df8f5a -r d3e0d57cd3ff test/jdk/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/frame/FrameDemo.java --- /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); + +//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"); +} +} +// + +// 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() { + +//Create frame and set simple properties +JFrame frame = new JFrame(INTERNAL_FRAME); +frame.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE); +// + +//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); +// + +//Make toplevel "busy" +// busy glasspane is initially invisible +frame.setGlassPane(new BusyGlass()); +// + +//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); +// + +//Add a horizontal toolbar +JToolBar toolbar = new JToolBar(TOOLBAR); +frame.add(toolbar, BorderLayout.NORTH); +toolbar.add(new JButton(TOOLBAR_BUTTON)); +// + +//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 + +//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); +// + +//Initialize frame's size to fit it's content +frame.pack(); +// + +return frame; +} + +public void start() { +DemoUtilities.setToplevelLocation(frame, frameSpaceholder, SwingConstants.CENTER); +showFrame(); +} + +public void stop() { +//Hide frame +frame.setVisible(false); +// +} + +public void showFrame() { +//Show frame +// if frame already visible, then bring to the front +if (frame.isShowing()) { +frame.toFront(); +} else { +frame.setVisible(true); +} +// +} + +//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(); +} +// { + 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(); + } + + } +} diff -r c3fc25df8f5a -r d3e0d57cd3ff test/langtools/jdk/javadoc/doclet/JavascriptWinTitle/JavascriptWinTitle.java --- 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", diff -r c3fc25df8f5a -r d3e0d57cd3ff test/langtools/jdk/javadoc/doclet/testClassCrossReferences/C.java --- 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}
* Cross link to class: {@link java.math.BigDecimal Link to external class BigDecimal}
* Cross link to member: {@link java.math.BigInteger#gcd(java.math.BigInteger) Link to external member gcd}
- * Cross link to package: {@link javax.tools.SimpleJavaFileObject#URI Link to external member URI}
+ * Cross link to package: {@link javax.tools.SimpleJavaFileObject#uri Link to external member URI}
*/ public class C { diff -r c3fc25df8f5a -r d3e0d57cd3ff test/langtools/jdk/javadoc/doclet/testClassCrossReferences/TestClassCrossReferences.java --- 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\">Link to external class BigDecimal", "Link to external member gcd", - "Link to external member URI", "
\n" + "
Overrides:
\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, diff -r c3fc25df8f5a -r d3e0d57cd3ff test/langtools/jdk/javadoc/doclet/testDocRootInlineTag/TestDocRootInlineTag.java --- 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"); diff -r c3fc25df8f5a -r d3e0d57cd3ff test/langtools/jdk/javadoc/doclet/testExternalOverridenMethod/TestExternalOverridenMethod.java --- 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, diff -r c3fc25df8f5a -r d3e0d57cd3ff test/langtools/jdk/javadoc/doclet/testHref/TestHref.java --- 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, diff -r c3fc25df8f5a -r d3e0d57cd3ff test/langtools/jdk/javadoc/doclet/testIndexTaglet/TestIndexTaglet.java --- /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", + "

Method Detail

\n", + "
test description with search_phrase_a
"); + + checkOrder("pkg/A.html", + "

Method Summary

\n", + "
test description with search_phrase_a
"); + } + + 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); + + } +} diff -r c3fc25df8f5a -r d3e0d57cd3ff test/langtools/jdk/javadoc/doclet/testLinkOption/TestLinkOption.java --- 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, diff -r c3fc25df8f5a -r d3e0d57cd3ff test/langtools/jdk/javadoc/doclet/testLinkOption/TestLinkOptionWithModule.java --- /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"); + } + + @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"); + } + + @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); + } + +} diff -r c3fc25df8f5a -r d3e0d57cd3ff test/langtools/jdk/javadoc/doclet/testLinkOption/TestNewLineInLink.java --- 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"); diff -r c3fc25df8f5a -r d3e0d57cd3ff test/langtools/jdk/javadoc/doclet/testModules/TestModules.java --- 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 @@ + "moduleA\n" + "\n" + "
This is a test description for the moduleA module with a Search " - + "phrase search phrase.
\n" + + "phrase search phrase.\n" + "\n" + "\n" + "\n" @@ -1164,7 +1162,7 @@ + "
moduleA - module moduleA
\n" + "
\n" + "
This is a test description for the moduleA module with a Search " - + "phrase search phrase.
\n" + + "phrase search phrase.\n" + "
\n" + "
moduleB - module moduleB
\n" + "
\n" @@ -1193,7 +1191,7 @@ "moduleA\n" + "\n" + "
This is a test description for the moduleA module with a Search " - + "phrase search phrase.
\n" + + "phrase search phrase.\n" + "", "moduleB\n" + "\n" @@ -1235,7 +1233,7 @@ + "moduleA\n" + "\n" + "
This is a test description for the moduleA module with a Search " - + "phrase search phrase.
\n" + + "phrase search phrase.\n" + "", "\n" + "\n" @@ -1617,10 +1615,10 @@ void checkLinkOffline() { checkOutput("moduleB/testpkg3mdlB/package-summary.html", true, - "Link to String Class"); checkOutput("moduleB/testpkg3mdlB/package-summary.html", true, - "Link to java.lang package"); checkOutput("moduleB/testpkg3mdlB/package-summary.html", true, "public static Coin" + diff -r c3fc25df8f5a -r d3e0d57cd3ff test/langtools/jdk/javadoc/doclet/testTitleInHref/TestTitleInHref.java --- 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"); diff -r c3fc25df8f5a -r d3e0d57cd3ff test/langtools/jdk/javadoc/tool/api/basic/IsSupportedOptionTest.java --- 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); diff -r c3fc25df8f5a -r d3e0d57cd3ff test/langtools/jdk/javadoc/tool/sourceOption/SourceOption.java --- 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; diff -r c3fc25df8f5a -r d3e0d57cd3ff test/langtools/tools/javac/analyzer/AnalyzersCheckSourceLevel.java --- /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 diff -r c3fc25df8f5a -r d3e0d57cd3ff test/langtools/tools/javac/analyzer/AnalyzersCheckSourceLevel.out --- /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 diff -r c3fc25df8f5a -r d3e0d57cd3ff test/langtools/tools/javac/analyzer/T8211102.java --- /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() { public Iterator iterator() { return null; } }).toString(); + } +} diff -r c3fc25df8f5a -r d3e0d57cd3ff test/langtools/tools/javac/flags/FlagsTest.java --- /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); + } + } + } +} diff -r c3fc25df8f5a -r d3e0d57cd3ff test/langtools/tools/javac/lambda/LambdaNoFuncIntfFlow.java --- /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) i : () -> { return null; }; + j = 0; + Runnable r = () -> t(j); + } +} diff -r c3fc25df8f5a -r d3e0d57cd3ff test/langtools/tools/javac/lambda/LambdaNoFuncIntfFlow.out --- /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, 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 diff -r c3fc25df8f5a -r d3e0d57cd3ff test/langtools/tools/javac/lambda/NoTargetLambda.java --- /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(); + } +} diff -r c3fc25df8f5a -r d3e0d57cd3ff test/langtools/tools/javac/lambda/NoTargetLambda.out --- /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 diff -r c3fc25df8f5a -r d3e0d57cd3ff test/langtools/tools/javac/launcher/SourceLauncherTest.java --- 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 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 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()) { diff -r c3fc25df8f5a -r d3e0d57cd3ff test/langtools/tools/javac/launcher/src/CLTest.java --- 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 e = cl.getResources(name); diff -r c3fc25df8f5a -r d3e0d57cd3ff test/langtools/tools/javac/options/IsSupportedOptionTest.java --- 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); diff -r c3fc25df8f5a -r d3e0d57cd3ff test/langtools/tools/javadoc/api/basic/IsSupportedOptionTest.java --- 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); - } -} - diff -r c3fc25df8f5a -r d3e0d57cd3ff test/langtools/tools/javadoc/sourceOption/SourceOption.java --- 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.*; diff -r c3fc25df8f5a -r d3e0d57cd3ff test/lib/jdk/test/lib/artifacts/ArtifactResolver.java --- 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) { diff -r c3fc25df8f5a -r d3e0d57cd3ff test/lib/jdk/test/lib/artifacts/JibArtifactManager.java --- 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 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 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 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; - } + } } diff -r c3fc25df8f5a -r d3e0d57cd3ff test/lib/jdk/test/lib/jfr/EventNames.java --- 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";
Requires