diff -ru shenandoah-jdk8u/hotspot/src/cpu/x86/vm/x86_64.ad aarch64-port-jdk8u-shenandoah/hotspot/src/cpu/x86/vm/x86_64.ad --- shenandoah-jdk8u/hotspot/src/cpu/x86/vm/x86_64.ad 2018-03-22 10:08:57.993804930 +0100 +++ aarch64-port-jdk8u-shenandoah/hotspot/src/cpu/x86/vm/x86_64.ad 2018-03-22 10:25:21.103901198 +0100 @@ -172,7 +172,7 @@ // Class for all pointer registers (including RSP and RBP) reg_class any_reg_with_rbp(RAX, RAX_H, RDX, RDX_H, - RBP, RBP_H, + RBP, RBP_H, RDI, RDI_H, RSI, RSI_H, RCX, RCX_H, @@ -189,7 +189,7 @@ // Class for all pointer registers (including RSP, but excluding RBP) reg_class any_reg_no_rbp(RAX, RAX_H, - RDX, RDX_H, + RDX, RDX_H, RDI, RDI_H, RSI, RSI_H, RCX, RCX_H, @@ -205,10 +205,10 @@ R15, R15_H); // Dynamic register class that selects at runtime between register classes -// any_reg_no_rbp and any_reg_with_rbp (depending on the value of the flag PreserveFramePointer). +// any_reg_no_rbp and any_reg_with_rbp (depending on the value of the flag PreserveFramePointer). // Equivalent to: return PreserveFramePointer ? any_reg_no_rbp : any_reg_with_rbp; reg_class_dynamic any_reg(any_reg_no_rbp, any_reg_with_rbp, %{ PreserveFramePointer %}); - + // Class for all pointer registers (excluding RSP) reg_class ptr_reg_with_rbp(RAX, RAX_H, RDX, RDX_H, @@ -226,7 +226,7 @@ // Class for all pointer registers (excluding RSP and RBP) reg_class ptr_reg_no_rbp(RAX, RAX_H, - RDX, RDX_H, + RDX, RDX_H, RDI, RDI_H, RSI, RSI_H, RCX, RCX_H, @@ -551,7 +551,7 @@ int MachCallStaticJavaNode::ret_addr_offset() { int offset = 5; // 5 bytes from start of call to where return address points - offset += clear_avx_size(); + offset += clear_avx_size(); return offset; } @@ -866,14 +866,14 @@ st->print("subq rsp, #%d\t# Create frame",framesize); st->print("\n\t"); framesize -= wordSize; - st->print("movq [rsp + #%d], rbp\t# Save rbp",framesize); + st->print("movq [rsp + #%d], rbp\t# Save rbp",framesize); if (PreserveFramePointer) { st->print("\n\t"); st->print("movq rbp, rsp\t# Save the caller's SP into rbp"); if (framesize > 0) { st->print("\n\t"); st->print("addq rbp, #%d", framesize); - } + } } } @@ -1583,7 +1583,7 @@ return MachNode::size(ra_); // too many variables; just compute it // the hard way } - + //============================================================================= @@ -3368,7 +3368,7 @@ // Pointer Register operand any_RegP() %{ - constraint(ALLOC_IN_RC(any_reg)); + constraint(ALLOC_IN_RC(any_reg)); match(RegP); match(rax_RegP); match(rbx_RegP); @@ -4980,7 +4980,7 @@ %} // Load Unsigned Integer into Long Register -instruct loadUI2L(rRegL dst, memory mem, immL_32bits mask) +instruct loadUI2L(rRegL dst, memory mem, immL_32bits mask) %{ match(Set dst (AndL (ConvI2L (LoadI mem)) mask)); @@ -10581,7 +10581,7 @@ format %{ "xorq rax, rax\t# ClearArray:\n\t" "rep stosq\t# Store rax to *rdi++ while rcx--" %} - ins_encode %{ + ins_encode %{ __ clear_mem($base$$Register, $cnt$$Register, $zero$$Register); %} ins_pipe(pipe_slow); @@ -10596,7 +10596,7 @@ format %{ "xorq rax, rax\t# ClearArray:\n\t" "shlq rcx,3\t# Convert doublewords to bytes\n\t" "rep stosb\t# Store rax to *rdi++ while rcx--" %} - ins_encode %{ + ins_encode %{ __ clear_mem($base$$Register, $cnt$$Register, $zero$$Register); %} ins_pipe( pipe_slow ); diff -ru shenandoah-jdk8u/hotspot/src/share/vm/adlc/formssel.cpp aarch64-port-jdk8u-shenandoah/hotspot/src/share/vm/adlc/formssel.cpp --- shenandoah-jdk8u/hotspot/src/share/vm/adlc/formssel.cpp 2018-03-22 10:08:57.938805650 +0100 +++ aarch64-port-jdk8u-shenandoah/hotspot/src/share/vm/adlc/formssel.cpp 2018-03-21 19:30:39.961298084 +0100 @@ -4066,7 +4066,8 @@ !strcmp(_opType,"StoreFence") || !strcmp(_opType,"MemBarVolatile") || !strcmp(_opType,"MemBarCPUOrder") || - !strcmp(_opType,"MemBarStoreStore"); + !strcmp(_opType,"MemBarStoreStore") || + !strcmp(_opType, "OnSpinWait"); } bool MatchRule::is_ideal_loadPC() const { Nur in shenandoah-jdk8u/hotspot/src/share/vm/c1: c1_LIRGenerator.cpp.orig. diff -ru shenandoah-jdk8u/hotspot/src/share/vm/opto/library_call.cpp aarch64-port-jdk8u-shenandoah/hotspot/src/share/vm/opto/library_call.cpp --- shenandoah-jdk8u/hotspot/src/share/vm/opto/library_call.cpp 2018-03-22 10:08:57.967805270 +0100 +++ aarch64-port-jdk8u-shenandoah/hotspot/src/share/vm/opto/library_call.cpp 2018-03-22 10:22:34.438090982 +0100 @@ -1252,6 +1252,7 @@ if (stopped()) { return true; } + set_result(make_string_method_node(Op_StrComp, receiver, arg)); return true; } @@ -3845,7 +3846,7 @@ set_control(region->in(_prim_0_path)); // go back to first null check if (!stopped()) { // Since superc is primitive, make a guard for the superc==subc case. - Node* cmp_eq = _gvn.transform(new (C) CmpPNode(args[0], args[1])); + Node* cmp_eq = _gvn.transform(new (C)CmpPNode(args[0], args[1])); Node* bol_eq = _gvn.transform(new (C) BoolNode(cmp_eq, BoolTest::eq)); generate_guard(bol_eq, region, PROB_FAIR); if (region->req() == PATH_LIMIT+1) { @@ -6615,6 +6616,7 @@ Node* dest = argument(4); Node* dest_offset = argument(5); + // inline_cipherBlockChaining_AESCrypt_predicate() has its own // barrier. This one should optimize away. src = shenandoah_cast_not_null(src); diff -ru shenandoah-jdk8u/hotspot/src/share/vm/opto/phaseX.cpp aarch64-port-jdk8u-shenandoah/hotspot/src/share/vm/opto/phaseX.cpp --- shenandoah-jdk8u/hotspot/src/share/vm/opto/phaseX.cpp 2018-03-22 10:08:57.995804904 +0100 +++ aarch64-port-jdk8u-shenandoah/hotspot/src/share/vm/opto/phaseX.cpp 2018-03-22 10:19:42.903344737 +0100 @@ -1694,6 +1694,15 @@ } } } + // If n is used in a counted loop exit condition then the type + // of the counted loop's Phi depends on the type of n. See + // PhiNode::Value(). + if (m_op == Op_CmpI) { + PhiNode* phi = countedloop_phi_from_cmp((CmpINode*)m, n); + if (phi != NULL) { + worklist.push(phi); + } + } if (m->is_ShenandoahBarrier()) { for (DUIterator_Fast i2max, i2 = m->fast_outs(i2max); i2 < i2max; i2++) { Node* p = m->fast_out(i2); @@ -1713,15 +1722,6 @@ } } } - // If n is used in a counted loop exit condition then the type - // of the counted loop's Phi depends on the type of n. See - // PhiNode::Value(). - if (m_op == Op_CmpI) { - PhiNode* phi = countedloop_phi_from_cmp((CmpINode*)m, n); - if (phi != NULL) { - worklist.push(phi); - } - } } } } diff -ru shenandoah-jdk8u/hotspot/src/share/vm/prims/jni.cpp aarch64-port-jdk8u-shenandoah/hotspot/src/share/vm/prims/jni.cpp --- shenandoah-jdk8u/hotspot/src/share/vm/prims/jni.cpp 2018-03-22 10:08:58.007804747 +0100 +++ aarch64-port-jdk8u-shenandoah/hotspot/src/share/vm/prims/jni.cpp 2018-03-22 10:25:22.023889111 +0100 @@ -3801,7 +3801,6 @@ DTRACE_PROBE5(hotspot_jni, Get##Result##ArrayRegion__entry, env, array, start, len, buf);\ DT_VOID_RETURN_MARK(Get##Result##ArrayRegion); \ typeArrayOop src = typeArrayOop(JNIHandles::resolve_non_null(array)); \ - src = typeArrayOop(oopDesc::bs()->read_barrier(src)); \ if (start < 0 || len < 0 || ((unsigned int)start + (unsigned int)len > (unsigned int)src->length())) { \ THROW(vmSymbols::java_lang_ArrayIndexOutOfBoundsException()); \ } else { \ @@ -3837,6 +3836,7 @@ EntryProbe; \ DT_VOID_RETURN_MARK(Get##Result##ArrayRegion); \ typeArrayOop src = typeArrayOop(JNIHandles::resolve_non_null(array)); \ + src = typeArrayOop(oopDesc::bs()->read_barrier(src)); \ if (start < 0 || len < 0 || (start > src->length() - len)) { \ THROW(vmSymbols::java_lang_ArrayIndexOutOfBoundsException()); \ } else { \ @@ -3886,7 +3886,6 @@ DTRACE_PROBE5(hotspot_jni, Set##Result##ArrayRegion__entry, env, array, start, len, buf);\ DT_VOID_RETURN_MARK(Set##Result##ArrayRegion); \ typeArrayOop dst = typeArrayOop(JNIHandles::resolve_non_null(array)); \ - dst = typeArrayOop(oopDesc::bs()->write_barrier(dst)); \ if (start < 0 || len < 0 || ((unsigned int)start + (unsigned int)len > (unsigned int)dst->length())) { \ THROW(vmSymbols::java_lang_ArrayIndexOutOfBoundsException()); \ } else { \ @@ -3922,6 +3921,7 @@ EntryProbe; \ DT_VOID_RETURN_MARK(Set##Result##ArrayRegion); \ typeArrayOop dst = typeArrayOop(JNIHandles::resolve_non_null(array)); \ + dst = typeArrayOop(oopDesc::bs()->write_barrier(dst)); \ if (start < 0 || len < 0 || (start > dst->length() - len)) { \ THROW(vmSymbols::java_lang_ArrayIndexOutOfBoundsException()); \ } else { \ diff -ru shenandoah-jdk8u/hotspot/src/share/vm/prims/methodHandles.cpp aarch64-port-jdk8u-shenandoah/hotspot/src/share/vm/prims/methodHandles.cpp --- shenandoah-jdk8u/hotspot/src/share/vm/prims/methodHandles.cpp 2018-03-22 10:08:57.940805624 +0100 +++ aarch64-port-jdk8u-shenandoah/hotspot/src/share/vm/prims/methodHandles.cpp 2018-03-21 19:30:40.058296754 +0100 @@ -861,7 +861,7 @@ if (!java_lang_invoke_MemberName::is_instance(result())) return -99; // caller bug! oop saved = MethodHandles::init_field_MemberName(result, st.field_descriptor()); - if (! oopDesc::equals(saved, result())) + if (!oopDesc::equals(saved, result())) results->obj_at_put(rfill-1, saved); // show saved instance to user } else if (++overflow >= overflow_limit) { match_flags = 0; break; // got tired of looking at overflow @@ -914,7 +914,7 @@ // Since this is going through the methods to create MemberNames, don't search // for matching methods already in the table oop saved = MethodHandles::init_method_MemberName(result, info, /*intern*/false); - if (! oopDesc::equals(saved, result())) + if (!oopDesc::equals(saved, result())) results->obj_at_put(rfill-1, saved); // show saved instance to user } else if (++overflow >= overflow_limit) { match_flags = 0; break; // got tired of looking at overflow