Tue, 13 Apr 2010 13:01:37 -0700
Merge
1.1 --- a/src/cpu/sparc/vm/c1_LIRAssembler_sparc.cpp Fri Apr 09 15:01:49 2010 -0700 1.2 +++ b/src/cpu/sparc/vm/c1_LIRAssembler_sparc.cpp Tue Apr 13 13:01:37 2010 -0700 1.3 @@ -1728,9 +1728,13 @@ 1.4 ShouldNotReachHere(); 1.5 } 1.6 } else if (code == lir_cmp_l2i) { 1.7 +#ifdef _LP64 1.8 + __ lcmp(left->as_register_lo(), right->as_register_lo(), dst->as_register()); 1.9 +#else 1.10 __ lcmp(left->as_register_hi(), left->as_register_lo(), 1.11 right->as_register_hi(), right->as_register_lo(), 1.12 dst->as_register()); 1.13 +#endif 1.14 } else { 1.15 ShouldNotReachHere(); 1.16 } 1.17 @@ -2849,7 +2853,7 @@ 1.18 1.19 1.20 void LIR_Assembler::align_backward_branch_target() { 1.21 - __ align(16); 1.22 + __ align(OptoLoopAlignment); 1.23 } 1.24 1.25
2.1 --- a/src/cpu/sparc/vm/c2_globals_sparc.hpp Fri Apr 09 15:01:49 2010 -0700 2.2 +++ b/src/cpu/sparc/vm/c2_globals_sparc.hpp Tue Apr 13 13:01:37 2010 -0700 2.3 @@ -60,9 +60,6 @@ 2.4 define_pd_global(intx, INTPRESSURE, 48); // large register set 2.5 define_pd_global(intx, InteriorEntryAlignment, 16); // = CodeEntryAlignment 2.6 define_pd_global(intx, NewSizeThreadIncrease, ScaleForWordSize(4*K)); 2.7 -// The default setting 16/16 seems to work best. 2.8 -// (For _228_jack 16/16 is 2% better than 4/4, 16/4, 32/32, 32/16, or 16/32.) 2.9 -define_pd_global(intx, OptoLoopAlignment, 16); // = 4*wordSize 2.10 define_pd_global(intx, RegisterCostAreaRatio, 12000); 2.11 define_pd_global(bool, UseTLAB, true); 2.12 define_pd_global(bool, ResizeTLAB, true);
3.1 --- a/src/cpu/sparc/vm/globals_sparc.hpp Fri Apr 09 15:01:49 2010 -0700 3.2 +++ b/src/cpu/sparc/vm/globals_sparc.hpp Tue Apr 13 13:01:37 2010 -0700 3.3 @@ -40,6 +40,9 @@ 3.4 define_pd_global(bool, UncommonNullCast, true); // Uncommon-trap NULLs past to check cast 3.5 3.6 define_pd_global(intx, CodeEntryAlignment, 32); 3.7 +// The default setting 16/16 seems to work best. 3.8 +// (For _228_jack 16/16 is 2% better than 4/4, 16/4, 32/32, 32/16, or 16/32.) 3.9 +define_pd_global(intx, OptoLoopAlignment, 16); // = 4*wordSize 3.10 define_pd_global(intx, InlineFrequencyCount, 50); // we can use more inlining on the SPARC 3.11 define_pd_global(intx, InlineSmallCode, 1500); 3.12 #ifdef _LP64
4.1 --- a/src/cpu/sparc/vm/sparc.ad Fri Apr 09 15:01:49 2010 -0700 4.2 +++ b/src/cpu/sparc/vm/sparc.ad Tue Apr 13 13:01:37 2010 -0700 4.3 @@ -471,6 +471,9 @@ 4.4 source %{ 4.5 #define __ _masm. 4.6 4.7 +// Block initializing store 4.8 +#define ASI_BLK_INIT_QUAD_LDD_P 0xE2 4.9 + 4.10 // tertiary op of a LoadP or StoreP encoding 4.11 #define REGP_OP true 4.12 4.13 @@ -6147,6 +6150,7 @@ 4.14 %} 4.15 4.16 instruct prefetchw( memory mem ) %{ 4.17 + predicate(AllocatePrefetchStyle != 3 ); 4.18 match( PrefetchWrite mem ); 4.19 ins_cost(MEMORY_REF_COST); 4.20 4.21 @@ -6156,6 +6160,23 @@ 4.22 ins_pipe(iload_mem); 4.23 %} 4.24 4.25 +// Use BIS instruction to prefetch. 4.26 +instruct prefetchw_bis( memory mem ) %{ 4.27 + predicate(AllocatePrefetchStyle == 3); 4.28 + match( PrefetchWrite mem ); 4.29 + ins_cost(MEMORY_REF_COST); 4.30 + 4.31 + format %{ "STXA G0,$mem\t! // Block initializing store" %} 4.32 + ins_encode %{ 4.33 + Register base = as_Register($mem$$base); 4.34 + int disp = $mem$$disp; 4.35 + if (disp != 0) { 4.36 + __ add(base, AllocatePrefetchStepSize, base); 4.37 + } 4.38 + __ stxa(G0, base, G0, ASI_BLK_INIT_QUAD_LDD_P); 4.39 + %} 4.40 + ins_pipe(istore_mem_reg); 4.41 +%} 4.42 4.43 //----------Store Instructions------------------------------------------------- 4.44 // Store Byte
5.1 --- a/src/cpu/sparc/vm/stubGenerator_sparc.cpp Fri Apr 09 15:01:49 2010 -0700 5.2 +++ b/src/cpu/sparc/vm/stubGenerator_sparc.cpp Tue Apr 13 13:01:37 2010 -0700 5.3 @@ -1148,7 +1148,7 @@ 5.4 __ andn(from, 7, from); // Align address 5.5 __ ldx(from, 0, O3); 5.6 __ inc(from, 8); 5.7 - __ align(16); 5.8 + __ align(OptoLoopAlignment); 5.9 __ BIND(L_loop); 5.10 __ ldx(from, 0, O4); 5.11 __ deccc(count, count_dec); // Can we do next iteration after this one? 5.12 @@ -1220,7 +1220,7 @@ 5.13 // 5.14 __ andn(end_from, 7, end_from); // Align address 5.15 __ ldx(end_from, 0, O3); 5.16 - __ align(16); 5.17 + __ align(OptoLoopAlignment); 5.18 __ BIND(L_loop); 5.19 __ ldx(end_from, -8, O4); 5.20 __ deccc(count, count_dec); // Can we do next iteration after this one? 5.21 @@ -1349,7 +1349,7 @@ 5.22 __ BIND(L_copy_byte); 5.23 __ br_zero(Assembler::zero, false, Assembler::pt, count, L_exit); 5.24 __ delayed()->nop(); 5.25 - __ align(16); 5.26 + __ align(OptoLoopAlignment); 5.27 __ BIND(L_copy_byte_loop); 5.28 __ ldub(from, offset, O3); 5.29 __ deccc(count); 5.30 @@ -1445,7 +1445,7 @@ 5.31 L_aligned_copy, L_copy_byte); 5.32 } 5.33 // copy 4 elements (16 bytes) at a time 5.34 - __ align(16); 5.35 + __ align(OptoLoopAlignment); 5.36 __ BIND(L_aligned_copy); 5.37 __ dec(end_from, 16); 5.38 __ ldx(end_from, 8, O3); 5.39 @@ -1461,7 +1461,7 @@ 5.40 __ BIND(L_copy_byte); 5.41 __ br_zero(Assembler::zero, false, Assembler::pt, count, L_exit); 5.42 __ delayed()->nop(); 5.43 - __ align(16); 5.44 + __ align(OptoLoopAlignment); 5.45 __ BIND(L_copy_byte_loop); 5.46 __ dec(end_from); 5.47 __ dec(end_to); 5.48 @@ -1577,7 +1577,7 @@ 5.49 __ BIND(L_copy_2_bytes); 5.50 __ br_zero(Assembler::zero, false, Assembler::pt, count, L_exit); 5.51 __ delayed()->nop(); 5.52 - __ align(16); 5.53 + __ align(OptoLoopAlignment); 5.54 __ BIND(L_copy_2_bytes_loop); 5.55 __ lduh(from, offset, O3); 5.56 __ deccc(count); 5.57 @@ -1684,7 +1684,7 @@ 5.58 L_aligned_copy, L_copy_2_bytes); 5.59 } 5.60 // copy 4 elements (16 bytes) at a time 5.61 - __ align(16); 5.62 + __ align(OptoLoopAlignment); 5.63 __ BIND(L_aligned_copy); 5.64 __ dec(end_from, 16); 5.65 __ ldx(end_from, 8, O3); 5.66 @@ -1781,7 +1781,7 @@ 5.67 // copy with shift 4 elements (16 bytes) at a time 5.68 __ dec(count, 4); // The cmp at the beginning guaranty count >= 4 5.69 5.70 - __ align(16); 5.71 + __ align(OptoLoopAlignment); 5.72 __ BIND(L_copy_16_bytes); 5.73 __ ldx(from, 4, O4); 5.74 __ deccc(count, 4); // Can we do next iteration after this one? 5.75 @@ -1907,7 +1907,7 @@ 5.76 // to form 2 aligned 8-bytes chunks to store. 5.77 // 5.78 __ ldx(end_from, -4, O3); 5.79 - __ align(16); 5.80 + __ align(OptoLoopAlignment); 5.81 __ BIND(L_copy_16_bytes); 5.82 __ ldx(end_from, -12, O4); 5.83 __ deccc(count, 4); 5.84 @@ -1929,7 +1929,7 @@ 5.85 __ delayed()->inc(count, 4); 5.86 5.87 // copy 4 elements (16 bytes) at a time 5.88 - __ align(16); 5.89 + __ align(OptoLoopAlignment); 5.90 __ BIND(L_aligned_copy); 5.91 __ dec(end_from, 16); 5.92 __ ldx(end_from, 8, O3); 5.93 @@ -2000,6 +2000,27 @@ 5.94 // to: O1 5.95 // count: O2 treated as signed 5.96 // 5.97 + // count -= 2; 5.98 + // if ( count >= 0 ) { // >= 2 elements 5.99 + // if ( count > 6) { // >= 8 elements 5.100 + // count -= 6; // original count - 8 5.101 + // do { 5.102 + // copy_8_elements; 5.103 + // count -= 8; 5.104 + // } while ( count >= 0 ); 5.105 + // count += 6; 5.106 + // } 5.107 + // if ( count >= 0 ) { // >= 2 elements 5.108 + // do { 5.109 + // copy_2_elements; 5.110 + // } while ( (count=count-2) >= 0 ); 5.111 + // } 5.112 + // } 5.113 + // count += 2; 5.114 + // if ( count != 0 ) { // 1 element left 5.115 + // copy_1_element; 5.116 + // } 5.117 + // 5.118 void generate_disjoint_long_copy_core(bool aligned) { 5.119 Label L_copy_8_bytes, L_copy_16_bytes, L_exit; 5.120 const Register from = O0; // source array address 5.121 @@ -2012,7 +2033,39 @@ 5.122 __ mov(G0, offset0); // offset from start of arrays (0) 5.123 __ brx(Assembler::negative, false, Assembler::pn, L_copy_8_bytes ); 5.124 __ delayed()->add(offset0, 8, offset8); 5.125 - __ align(16); 5.126 + 5.127 + // Copy by 64 bytes chunks 5.128 + Label L_copy_64_bytes; 5.129 + const Register from64 = O3; // source address 5.130 + const Register to64 = G3; // destination address 5.131 + __ subcc(count, 6, O3); 5.132 + __ brx(Assembler::negative, false, Assembler::pt, L_copy_16_bytes ); 5.133 + __ delayed()->mov(to, to64); 5.134 + // Now we can use O4(offset0), O5(offset8) as temps 5.135 + __ mov(O3, count); 5.136 + __ mov(from, from64); 5.137 + 5.138 + __ align(OptoLoopAlignment); 5.139 + __ BIND(L_copy_64_bytes); 5.140 + for( int off = 0; off < 64; off += 16 ) { 5.141 + __ ldx(from64, off+0, O4); 5.142 + __ ldx(from64, off+8, O5); 5.143 + __ stx(O4, to64, off+0); 5.144 + __ stx(O5, to64, off+8); 5.145 + } 5.146 + __ deccc(count, 8); 5.147 + __ inc(from64, 64); 5.148 + __ brx(Assembler::greaterEqual, false, Assembler::pt, L_copy_64_bytes); 5.149 + __ delayed()->inc(to64, 64); 5.150 + 5.151 + // Restore O4(offset0), O5(offset8) 5.152 + __ sub(from64, from, offset0); 5.153 + __ inccc(count, 6); 5.154 + __ brx(Assembler::negative, false, Assembler::pn, L_copy_8_bytes ); 5.155 + __ delayed()->add(offset0, 8, offset8); 5.156 + 5.157 + // Copy by 16 bytes chunks 5.158 + __ align(OptoLoopAlignment); 5.159 __ BIND(L_copy_16_bytes); 5.160 __ ldx(from, offset0, O3); 5.161 __ ldx(from, offset8, G3); 5.162 @@ -2023,6 +2076,7 @@ 5.163 __ brx(Assembler::greaterEqual, false, Assembler::pt, L_copy_16_bytes); 5.164 __ delayed()->inc(offset8, 16); 5.165 5.166 + // Copy last 8 bytes 5.167 __ BIND(L_copy_8_bytes); 5.168 __ inccc(count, 2); 5.169 __ brx(Assembler::zero, true, Assembler::pn, L_exit ); 5.170 @@ -2085,7 +2139,7 @@ 5.171 __ brx(Assembler::lessEqual, false, Assembler::pn, L_copy_8_bytes ); 5.172 __ delayed()->sllx(count, LogBytesPerLong, offset8); 5.173 __ sub(offset8, 8, offset0); 5.174 - __ align(16); 5.175 + __ align(OptoLoopAlignment); 5.176 __ BIND(L_copy_16_bytes); 5.177 __ ldx(from, offset8, O2); 5.178 __ ldx(from, offset0, O3); 5.179 @@ -2351,7 +2405,7 @@ 5.180 // (O5 = 0; ; O5 += wordSize) --- offset from src, dest arrays 5.181 // (O2 = len; O2 != 0; O2--) --- number of oops *remaining* 5.182 // G3, G4, G5 --- current oop, oop.klass, oop.klass.super 5.183 - __ align(16); 5.184 + __ align(OptoLoopAlignment); 5.185 5.186 __ BIND(store_element); 5.187 __ deccc(G1_remain); // decrement the count
6.1 --- a/src/cpu/sparc/vm/vm_version_sparc.cpp Fri Apr 09 15:01:49 2010 -0700 6.2 +++ b/src/cpu/sparc/vm/vm_version_sparc.cpp Tue Apr 13 13:01:37 2010 -0700 6.3 @@ -86,14 +86,24 @@ 6.4 if (FLAG_IS_DEFAULT(InteriorEntryAlignment)) { 6.5 FLAG_SET_DEFAULT(InteriorEntryAlignment, 4); 6.6 } 6.7 + if (is_niagara1_plus()) { 6.8 + if (AllocatePrefetchStyle > 0 && FLAG_IS_DEFAULT(AllocatePrefetchStyle)) { 6.9 + // Use BIS instruction for allocation prefetch. 6.10 + FLAG_SET_DEFAULT(AllocatePrefetchStyle, 3); 6.11 + if (FLAG_IS_DEFAULT(AllocatePrefetchDistance)) { 6.12 + // Use smaller prefetch distance on N2 with BIS 6.13 + FLAG_SET_DEFAULT(AllocatePrefetchDistance, 64); 6.14 + } 6.15 + } 6.16 + if (AllocatePrefetchStyle != 3 && FLAG_IS_DEFAULT(AllocatePrefetchDistance)) { 6.17 + // Use different prefetch distance without BIS 6.18 + FLAG_SET_DEFAULT(AllocatePrefetchDistance, 256); 6.19 + } 6.20 + } 6.21 +#endif 6.22 if (FLAG_IS_DEFAULT(OptoLoopAlignment)) { 6.23 FLAG_SET_DEFAULT(OptoLoopAlignment, 4); 6.24 } 6.25 - if (is_niagara1_plus() && FLAG_IS_DEFAULT(AllocatePrefetchDistance)) { 6.26 - // Use smaller prefetch distance on N2 6.27 - FLAG_SET_DEFAULT(AllocatePrefetchDistance, 256); 6.28 - } 6.29 -#endif 6.30 } 6.31 6.32 // Use hardware population count instruction if available.
7.1 --- a/src/cpu/x86/vm/assembler_x86.cpp Fri Apr 09 15:01:49 2010 -0700 7.2 +++ b/src/cpu/x86/vm/assembler_x86.cpp Tue Apr 13 13:01:37 2010 -0700 7.3 @@ -3365,6 +3365,13 @@ 7.4 7.5 #else // LP64 7.6 7.7 +void Assembler::set_byte_if_not_zero(Register dst) { 7.8 + int enc = prefix_and_encode(dst->encoding(), true); 7.9 + emit_byte(0x0F); 7.10 + emit_byte(0x95); 7.11 + emit_byte(0xE0 | enc); 7.12 +} 7.13 + 7.14 // 64bit only pieces of the assembler 7.15 // This should only be used by 64bit instructions that can use rip-relative 7.16 // it cannot be used by instructions that want an immediate value.
8.1 --- a/src/cpu/x86/vm/c1_LIRAssembler_x86.cpp Fri Apr 09 15:01:49 2010 -0700 8.2 +++ b/src/cpu/x86/vm/c1_LIRAssembler_x86.cpp Tue Apr 13 13:01:37 2010 -0700 8.3 @@ -2690,19 +2690,14 @@ 8.4 } else { 8.5 assert(code == lir_cmp_l2i, "check"); 8.6 #ifdef _LP64 8.7 - Register dest = dst->as_register(); 8.8 - __ xorptr(dest, dest); 8.9 - Label high, done; 8.10 - __ cmpptr(left->as_register_lo(), right->as_register_lo()); 8.11 - __ jcc(Assembler::equal, done); 8.12 - __ jcc(Assembler::greater, high); 8.13 - __ decrement(dest); 8.14 - __ jmp(done); 8.15 - __ bind(high); 8.16 - __ increment(dest); 8.17 - 8.18 - __ bind(done); 8.19 - 8.20 + Label done; 8.21 + Register dest = dst->as_register(); 8.22 + __ cmpptr(left->as_register_lo(), right->as_register_lo()); 8.23 + __ movl(dest, -1); 8.24 + __ jccb(Assembler::less, done); 8.25 + __ set_byte_if_not_zero(dest); 8.26 + __ movzbl(dest, dest); 8.27 + __ bind(done); 8.28 #else 8.29 __ lcmp2int(left->as_register_hi(), 8.30 left->as_register_lo(),
9.1 --- a/src/cpu/x86/vm/c1_Runtime1_x86.cpp Fri Apr 09 15:01:49 2010 -0700 9.2 +++ b/src/cpu/x86/vm/c1_Runtime1_x86.cpp Tue Apr 13 13:01:37 2010 -0700 9.3 @@ -781,7 +781,7 @@ 9.4 9.5 // Restore SP from BP if the exception PC is a MethodHandle call site. 9.6 NOT_LP64(__ get_thread(thread);) 9.7 - __ cmpl(Address(thread, JavaThread::is_method_handle_exception_offset()), 0); 9.8 + __ cmpl(Address(thread, JavaThread::is_method_handle_return_offset()), 0); 9.9 __ cmovptr(Assembler::notEqual, rsp, rbp); 9.10 9.11 // continue at exception handler (return address removed)
10.1 --- a/src/cpu/x86/vm/c2_globals_x86.hpp Fri Apr 09 15:01:49 2010 -0700 10.2 +++ b/src/cpu/x86/vm/c2_globals_x86.hpp Tue Apr 13 13:01:37 2010 -0700 10.3 @@ -80,7 +80,6 @@ 10.4 // Ergonomics related flags 10.5 define_pd_global(uint64_t,MaxRAM, 4ULL*G); 10.6 #endif // AMD64 10.7 -define_pd_global(intx, OptoLoopAlignment, 16); 10.8 define_pd_global(intx, RegisterCostAreaRatio, 16000); 10.9 10.10 // Peephole and CISC spilling both break the graph, and so makes the
11.1 --- a/src/cpu/x86/vm/globals_x86.hpp Fri Apr 09 15:01:49 2010 -0700 11.2 +++ b/src/cpu/x86/vm/globals_x86.hpp Tue Apr 13 13:01:37 2010 -0700 11.3 @@ -45,6 +45,7 @@ 11.4 #else 11.5 define_pd_global(intx, CodeEntryAlignment, 16); 11.6 #endif // COMPILER2 11.7 +define_pd_global(intx, OptoLoopAlignment, 16); 11.8 define_pd_global(intx, InlineFrequencyCount, 100); 11.9 define_pd_global(intx, InlineSmallCode, 1000); 11.10
12.1 --- a/src/cpu/x86/vm/runtime_x86_32.cpp Fri Apr 09 15:01:49 2010 -0700 12.2 +++ b/src/cpu/x86/vm/runtime_x86_32.cpp Tue Apr 13 13:01:37 2010 -0700 12.3 @@ -115,8 +115,8 @@ 12.4 12.5 // rax: exception handler for given <exception oop/exception pc> 12.6 12.7 - // Restore SP from BP if the exception PC is a MethodHandle call. 12.8 - __ cmpl(Address(rcx, JavaThread::is_method_handle_exception_offset()), 0); 12.9 + // Restore SP from BP if the exception PC is a MethodHandle call site. 12.10 + __ cmpl(Address(rcx, JavaThread::is_method_handle_return_offset()), 0); 12.11 __ cmovptr(Assembler::notEqual, rsp, rbp); 12.12 12.13 // We have a handler in rax, (could be deopt blob)
13.1 --- a/src/cpu/x86/vm/sharedRuntime_x86_64.cpp Fri Apr 09 15:01:49 2010 -0700 13.2 +++ b/src/cpu/x86/vm/sharedRuntime_x86_64.cpp Tue Apr 13 13:01:37 2010 -0700 13.3 @@ -3328,8 +3328,8 @@ 13.4 13.5 // rax: exception handler 13.6 13.7 - // Restore SP from BP if the exception PC is a MethodHandle call. 13.8 - __ cmpl(Address(r15_thread, JavaThread::is_method_handle_exception_offset()), 0); 13.9 + // Restore SP from BP if the exception PC is a MethodHandle call site. 13.10 + __ cmpl(Address(r15_thread, JavaThread::is_method_handle_return_offset()), 0); 13.11 __ cmovptr(Assembler::notEqual, rsp, rbp); 13.12 13.13 // We have a handler in rax (could be deopt blob).
14.1 --- a/src/cpu/x86/vm/stubGenerator_x86_32.cpp Fri Apr 09 15:01:49 2010 -0700 14.2 +++ b/src/cpu/x86/vm/stubGenerator_x86_32.cpp Tue Apr 13 13:01:37 2010 -0700 14.3 @@ -430,7 +430,7 @@ 14.4 __ verify_oop(exception_oop); 14.5 14.6 // Restore SP from BP if the exception PC is a MethodHandle call site. 14.7 - __ cmpl(Address(thread, JavaThread::is_method_handle_exception_offset()), 0); 14.8 + __ cmpl(Address(thread, JavaThread::is_method_handle_return_offset()), 0); 14.9 __ cmovptr(Assembler::notEqual, rsp, rbp); 14.10 14.11 // continue at exception handler (return address removed) 14.12 @@ -812,7 +812,7 @@ 14.13 Label L_copy_64_bytes_loop, L_copy_64_bytes, L_copy_8_bytes, L_exit; 14.14 // Copy 64-byte chunks 14.15 __ jmpb(L_copy_64_bytes); 14.16 - __ align(16); 14.17 + __ align(OptoLoopAlignment); 14.18 __ BIND(L_copy_64_bytes_loop); 14.19 14.20 if(UseUnalignedLoadStores) { 14.21 @@ -874,7 +874,7 @@ 14.22 Label L_copy_64_bytes_loop, L_copy_64_bytes, L_copy_8_bytes, L_exit; 14.23 // Copy 64-byte chunks 14.24 __ jmpb(L_copy_64_bytes); 14.25 - __ align(16); 14.26 + __ align(OptoLoopAlignment); 14.27 __ BIND(L_copy_64_bytes_loop); 14.28 __ movq(mmx0, Address(from, 0)); 14.29 __ movq(mmx1, Address(from, 8)); 14.30 @@ -1144,7 +1144,7 @@ 14.31 __ movl(Address(to, count, sf, 0), rdx); 14.32 __ jmpb(L_copy_8_bytes); 14.33 14.34 - __ align(16); 14.35 + __ align(OptoLoopAlignment); 14.36 // Move 8 bytes 14.37 __ BIND(L_copy_8_bytes_loop); 14.38 if (UseXMMForArrayCopy) { 14.39 @@ -1235,7 +1235,7 @@ 14.40 } 14.41 } else { 14.42 __ jmpb(L_copy_8_bytes); 14.43 - __ align(16); 14.44 + __ align(OptoLoopAlignment); 14.45 __ BIND(L_copy_8_bytes_loop); 14.46 __ fild_d(Address(from, 0)); 14.47 __ fistp_d(Address(from, to_from, Address::times_1)); 14.48 @@ -1282,7 +1282,7 @@ 14.49 14.50 __ jmpb(L_copy_8_bytes); 14.51 14.52 - __ align(16); 14.53 + __ align(OptoLoopAlignment); 14.54 __ BIND(L_copy_8_bytes_loop); 14.55 if (VM_Version::supports_mmx()) { 14.56 if (UseXMMForArrayCopy) { 14.57 @@ -1454,7 +1454,7 @@ 14.58 // Loop control: 14.59 // for (count = -count; count != 0; count++) 14.60 // Base pointers src, dst are biased by 8*count,to last element. 14.61 - __ align(16); 14.62 + __ align(OptoLoopAlignment); 14.63 14.64 __ BIND(L_store_element); 14.65 __ movptr(to_element_addr, elem); // store the oop
15.1 --- a/src/cpu/x86/vm/stubGenerator_x86_64.cpp Fri Apr 09 15:01:49 2010 -0700 15.2 +++ b/src/cpu/x86/vm/stubGenerator_x86_64.cpp Tue Apr 13 13:01:37 2010 -0700 15.3 @@ -871,9 +871,8 @@ 15.4 } 15.5 15.6 address generate_fp_mask(const char *stub_name, int64_t mask) { 15.7 + __ align(CodeEntryAlignment); 15.8 StubCodeMark mark(this, "StubRoutines", stub_name); 15.9 - 15.10 - __ align(16); 15.11 address start = __ pc(); 15.12 15.13 __ emit_data64( mask, relocInfo::none ); 15.14 @@ -1268,7 +1267,7 @@ 15.15 Label& L_copy_32_bytes, Label& L_copy_8_bytes) { 15.16 DEBUG_ONLY(__ stop("enter at entry label, not here")); 15.17 Label L_loop; 15.18 - __ align(16); 15.19 + __ align(OptoLoopAlignment); 15.20 __ BIND(L_loop); 15.21 if(UseUnalignedLoadStores) { 15.22 __ movdqu(xmm0, Address(end_from, qword_count, Address::times_8, -24)); 15.23 @@ -1309,7 +1308,7 @@ 15.24 Label& L_copy_32_bytes, Label& L_copy_8_bytes) { 15.25 DEBUG_ONLY(__ stop("enter at entry label, not here")); 15.26 Label L_loop; 15.27 - __ align(16); 15.28 + __ align(OptoLoopAlignment); 15.29 __ BIND(L_loop); 15.30 if(UseUnalignedLoadStores) { 15.31 __ movdqu(xmm0, Address(from, qword_count, Address::times_8, 16)); 15.32 @@ -2229,7 +2228,7 @@ 15.33 // Loop control: 15.34 // for (count = -count; count != 0; count++) 15.35 // Base pointers src, dst are biased by 8*(count-1),to last element. 15.36 - __ align(16); 15.37 + __ align(OptoLoopAlignment); 15.38 15.39 __ BIND(L_store_element); 15.40 __ store_heap_oop(to_element_addr, rax_oop); // store the oop
16.1 --- a/src/share/vm/c1/c1_LinearScan.cpp Fri Apr 09 15:01:49 2010 -0700 16.2 +++ b/src/share/vm/c1/c1_LinearScan.cpp Tue Apr 13 13:01:37 2010 -0700 16.3 @@ -2608,6 +2608,46 @@ 16.4 } else if (opr->is_double_xmm()) { 16.5 assert(opr->fpu_regnrLo() == opr->fpu_regnrHi(), "assumed in calculation"); 16.6 VMReg rname_first = opr->as_xmm_double_reg()->as_VMReg(); 16.7 +# ifdef _LP64 16.8 + first = new LocationValue(Location::new_reg_loc(Location::dbl, rname_first)); 16.9 + second = &_int_0_scope_value; 16.10 +# else 16.11 + first = new LocationValue(Location::new_reg_loc(Location::normal, rname_first)); 16.12 + // %%% This is probably a waste but we'll keep things as they were for now 16.13 + if (true) { 16.14 + VMReg rname_second = rname_first->next(); 16.15 + second = new LocationValue(Location::new_reg_loc(Location::normal, rname_second)); 16.16 + } 16.17 +# endif 16.18 +#endif 16.19 + 16.20 + } else if (opr->is_double_fpu()) { 16.21 + // On SPARC, fpu_regnrLo/fpu_regnrHi represents the two halves of 16.22 + // the double as float registers in the native ordering. On X86, 16.23 + // fpu_regnrLo is a FPU stack slot whose VMReg represents 16.24 + // the low-order word of the double and fpu_regnrLo + 1 is the 16.25 + // name for the other half. *first and *second must represent the 16.26 + // least and most significant words, respectively. 16.27 + 16.28 +#ifdef X86 16.29 + // the exact location of fpu stack values is only known 16.30 + // during fpu stack allocation, so the stack allocator object 16.31 + // must be present 16.32 + assert(use_fpu_stack_allocation(), "should not have float stack values without fpu stack allocation (all floats must be SSE2)"); 16.33 + assert(_fpu_stack_allocator != NULL, "must be present"); 16.34 + opr = _fpu_stack_allocator->to_fpu_stack(opr); 16.35 + 16.36 + assert(opr->fpu_regnrLo() == opr->fpu_regnrHi(), "assumed in calculation (only fpu_regnrHi is used)"); 16.37 +#endif 16.38 +#ifdef SPARC 16.39 + assert(opr->fpu_regnrLo() == opr->fpu_regnrHi() + 1, "assumed in calculation (only fpu_regnrHi is used)"); 16.40 +#endif 16.41 + 16.42 + VMReg rname_first = frame_map()->fpu_regname(opr->fpu_regnrHi()); 16.43 +#ifdef _LP64 16.44 + first = new LocationValue(Location::new_reg_loc(Location::dbl, rname_first)); 16.45 + second = &_int_0_scope_value; 16.46 +#else 16.47 first = new LocationValue(Location::new_reg_loc(Location::normal, rname_first)); 16.48 // %%% This is probably a waste but we'll keep things as they were for now 16.49 if (true) { 16.50 @@ -2616,37 +2656,6 @@ 16.51 } 16.52 #endif 16.53 16.54 - } else if (opr->is_double_fpu()) { 16.55 - // On SPARC, fpu_regnrLo/fpu_regnrHi represents the two halves of 16.56 - // the double as float registers in the native ordering. On X86, 16.57 - // fpu_regnrLo is a FPU stack slot whose VMReg represents 16.58 - // the low-order word of the double and fpu_regnrLo + 1 is the 16.59 - // name for the other half. *first and *second must represent the 16.60 - // least and most significant words, respectively. 16.61 - 16.62 -#ifdef X86 16.63 - // the exact location of fpu stack values is only known 16.64 - // during fpu stack allocation, so the stack allocator object 16.65 - // must be present 16.66 - assert(use_fpu_stack_allocation(), "should not have float stack values without fpu stack allocation (all floats must be SSE2)"); 16.67 - assert(_fpu_stack_allocator != NULL, "must be present"); 16.68 - opr = _fpu_stack_allocator->to_fpu_stack(opr); 16.69 - 16.70 - assert(opr->fpu_regnrLo() == opr->fpu_regnrHi(), "assumed in calculation (only fpu_regnrHi is used)"); 16.71 -#endif 16.72 -#ifdef SPARC 16.73 - assert(opr->fpu_regnrLo() == opr->fpu_regnrHi() + 1, "assumed in calculation (only fpu_regnrHi is used)"); 16.74 -#endif 16.75 - 16.76 - VMReg rname_first = frame_map()->fpu_regname(opr->fpu_regnrHi()); 16.77 - 16.78 - first = new LocationValue(Location::new_reg_loc(Location::normal, rname_first)); 16.79 - // %%% This is probably a waste but we'll keep things as they were for now 16.80 - if (true) { 16.81 - VMReg rname_second = rname_first->next(); 16.82 - second = new LocationValue(Location::new_reg_loc(Location::normal, rname_second)); 16.83 - } 16.84 - 16.85 } else { 16.86 ShouldNotReachHere(); 16.87 first = NULL;
17.1 --- a/src/share/vm/classfile/classFileParser.cpp Fri Apr 09 15:01:49 2010 -0700 17.2 +++ b/src/share/vm/classfile/classFileParser.cpp Tue Apr 13 13:01:37 2010 -0700 17.3 @@ -2956,8 +2956,8 @@ 17.4 #endif 17.5 bool compact_fields = CompactFields; 17.6 int allocation_style = FieldsAllocationStyle; 17.7 - if( allocation_style < 0 || allocation_style > 1 ) { // Out of range? 17.8 - assert(false, "0 <= FieldsAllocationStyle <= 1"); 17.9 + if( allocation_style < 0 || allocation_style > 2 ) { // Out of range? 17.10 + assert(false, "0 <= FieldsAllocationStyle <= 2"); 17.11 allocation_style = 1; // Optimistic 17.12 } 17.13 17.14 @@ -2993,6 +2993,25 @@ 17.15 } else if( allocation_style == 1 ) { 17.16 // Fields order: longs/doubles, ints, shorts/chars, bytes, oops 17.17 next_nonstatic_double_offset = next_nonstatic_field_offset; 17.18 + } else if( allocation_style == 2 ) { 17.19 + // Fields allocation: oops fields in super and sub classes are together. 17.20 + if( nonstatic_field_size > 0 && super_klass() != NULL && 17.21 + super_klass->nonstatic_oop_map_size() > 0 ) { 17.22 + int map_size = super_klass->nonstatic_oop_map_size(); 17.23 + OopMapBlock* first_map = super_klass->start_of_nonstatic_oop_maps(); 17.24 + OopMapBlock* last_map = first_map + map_size - 1; 17.25 + int next_offset = last_map->offset() + (last_map->count() * heapOopSize); 17.26 + if (next_offset == next_nonstatic_field_offset) { 17.27 + allocation_style = 0; // allocate oops first 17.28 + next_nonstatic_oop_offset = next_nonstatic_field_offset; 17.29 + next_nonstatic_double_offset = next_nonstatic_oop_offset + 17.30 + (nonstatic_oop_count * heapOopSize); 17.31 + } 17.32 + } 17.33 + if( allocation_style == 2 ) { 17.34 + allocation_style = 1; // allocate oops last 17.35 + next_nonstatic_double_offset = next_nonstatic_field_offset; 17.36 + } 17.37 } else { 17.38 ShouldNotReachHere(); 17.39 }
18.1 --- a/src/share/vm/code/codeCache.cpp Fri Apr 09 15:01:49 2010 -0700 18.2 +++ b/src/share/vm/code/codeCache.cpp Tue Apr 13 13:01:37 2010 -0700 18.3 @@ -1,5 +1,5 @@ 18.4 /* 18.5 - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. 18.6 + * Copyright 1997-2010 Sun Microsystems, Inc. All Rights Reserved. 18.7 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 18.8 * 18.9 * This code is free software; you can redistribute it and/or modify it 18.10 @@ -284,9 +284,11 @@ 18.11 cur->print_on(tty, is_live ? "scavenge root" : "dead scavenge root"); tty->cr(); 18.12 } 18.13 #endif //PRODUCT 18.14 - if (is_live) 18.15 + if (is_live) { 18.16 // Perform cur->oops_do(f), maybe just once per nmethod. 18.17 f->do_code_blob(cur); 18.18 + cur->fix_oop_relocations(); 18.19 + } 18.20 } 18.21 18.22 // Check for stray marks.
19.1 --- a/src/share/vm/memory/threadLocalAllocBuffer.hpp Fri Apr 09 15:01:49 2010 -0700 19.2 +++ b/src/share/vm/memory/threadLocalAllocBuffer.hpp Tue Apr 13 13:01:37 2010 -0700 19.3 @@ -111,7 +111,22 @@ 19.4 19.5 // Allocate size HeapWords. The memory is NOT initialized to zero. 19.6 inline HeapWord* allocate(size_t size); 19.7 - static size_t alignment_reserve() { return align_object_size(typeArrayOopDesc::header_size(T_INT)); } 19.8 + 19.9 + // Reserve space at the end of TLAB 19.10 + static size_t end_reserve() { 19.11 + int reserve_size = typeArrayOopDesc::header_size(T_INT); 19.12 + if (AllocatePrefetchStyle == 3) { 19.13 + // BIS is used to prefetch - we need a space for it. 19.14 + // +1 for rounding up to next cache line +1 to be safe 19.15 + int lines = AllocatePrefetchLines + 2; 19.16 + int step_size = AllocatePrefetchStepSize; 19.17 + int distance = AllocatePrefetchDistance; 19.18 + int prefetch_end = (distance + step_size*lines)/(int)HeapWordSize; 19.19 + reserve_size = MAX2(reserve_size, prefetch_end); 19.20 + } 19.21 + return reserve_size; 19.22 + } 19.23 + static size_t alignment_reserve() { return align_object_size(end_reserve()); } 19.24 static size_t alignment_reserve_in_bytes() { return alignment_reserve() * HeapWordSize; } 19.25 19.26 // Return tlab size or remaining space in eden such that the
20.1 --- a/src/share/vm/opto/c2_globals.hpp Fri Apr 09 15:01:49 2010 -0700 20.2 +++ b/src/share/vm/opto/c2_globals.hpp Tue Apr 13 13:01:37 2010 -0700 20.3 @@ -52,9 +52,6 @@ 20.4 "Code alignment for interior entry points " \ 20.5 "in generated code (in bytes)") \ 20.6 \ 20.7 - product_pd(intx, OptoLoopAlignment, \ 20.8 - "Align inner loops to zero relative to this modulus") \ 20.9 - \ 20.10 product(intx, MaxLoopPad, (OptoLoopAlignment-1), \ 20.11 "Align a loop if padding size in bytes is less or equal to this value") \ 20.12 \
21.1 --- a/src/share/vm/opto/macro.cpp Fri Apr 09 15:01:49 2010 -0700 21.2 +++ b/src/share/vm/opto/macro.cpp Tue Apr 13 13:01:37 2010 -0700 21.3 @@ -1487,11 +1487,11 @@ 21.4 Node*& contended_phi_rawmem, 21.5 Node* old_eden_top, Node* new_eden_top, 21.6 Node* length) { 21.7 + enum { fall_in_path = 1, pf_path = 2 }; 21.8 if( UseTLAB && AllocatePrefetchStyle == 2 ) { 21.9 // Generate prefetch allocation with watermark check. 21.10 // As an allocation hits the watermark, we will prefetch starting 21.11 // at a "distance" away from watermark. 21.12 - enum { fall_in_path = 1, pf_path = 2 }; 21.13 21.14 Node *pf_region = new (C, 3) RegionNode(3); 21.15 Node *pf_phi_rawmem = new (C, 3) PhiNode( pf_region, Type::MEMORY, 21.16 @@ -1570,6 +1570,45 @@ 21.17 needgc_false = pf_region; 21.18 contended_phi_rawmem = pf_phi_rawmem; 21.19 i_o = pf_phi_abio; 21.20 + } else if( UseTLAB && AllocatePrefetchStyle == 3 ) { 21.21 + // Insert a prefetch for each allocation only on the fast-path 21.22 + Node *pf_region = new (C, 3) RegionNode(3); 21.23 + Node *pf_phi_rawmem = new (C, 3) PhiNode( pf_region, Type::MEMORY, 21.24 + TypeRawPtr::BOTTOM ); 21.25 + 21.26 + // Generate several prefetch instructions only for arrays. 21.27 + uint lines = (length != NULL) ? AllocatePrefetchLines : 1; 21.28 + uint step_size = AllocatePrefetchStepSize; 21.29 + uint distance = AllocatePrefetchDistance; 21.30 + 21.31 + // Next cache address. 21.32 + Node *cache_adr = new (C, 4) AddPNode(old_eden_top, old_eden_top, 21.33 + _igvn.MakeConX(distance)); 21.34 + transform_later(cache_adr); 21.35 + cache_adr = new (C, 2) CastP2XNode(needgc_false, cache_adr); 21.36 + transform_later(cache_adr); 21.37 + Node* mask = _igvn.MakeConX(~(intptr_t)(step_size-1)); 21.38 + cache_adr = new (C, 3) AndXNode(cache_adr, mask); 21.39 + transform_later(cache_adr); 21.40 + cache_adr = new (C, 2) CastX2PNode(cache_adr); 21.41 + transform_later(cache_adr); 21.42 + 21.43 + // Prefetch 21.44 + Node *prefetch = new (C, 3) PrefetchWriteNode( contended_phi_rawmem, cache_adr ); 21.45 + prefetch->set_req(0, needgc_false); 21.46 + transform_later(prefetch); 21.47 + contended_phi_rawmem = prefetch; 21.48 + Node *prefetch_adr; 21.49 + distance = step_size; 21.50 + for ( uint i = 1; i < lines; i++ ) { 21.51 + prefetch_adr = new (C, 4) AddPNode( cache_adr, cache_adr, 21.52 + _igvn.MakeConX(distance) ); 21.53 + transform_later(prefetch_adr); 21.54 + prefetch = new (C, 3) PrefetchWriteNode( contended_phi_rawmem, prefetch_adr ); 21.55 + transform_later(prefetch); 21.56 + distance += step_size; 21.57 + contended_phi_rawmem = prefetch; 21.58 + } 21.59 } else if( AllocatePrefetchStyle > 0 ) { 21.60 // Insert a prefetch for each allocation only on the fast-path 21.61 Node *prefetch_adr;
22.1 --- a/src/share/vm/opto/memnode.hpp Fri Apr 09 15:01:49 2010 -0700 22.2 +++ b/src/share/vm/opto/memnode.hpp Tue Apr 13 13:01:37 2010 -0700 22.3 @@ -1244,5 +1244,5 @@ 22.4 virtual int Opcode() const; 22.5 virtual uint ideal_reg() const { return NotAMachineReg; } 22.6 virtual uint match_edge(uint idx) const { return idx==2; } 22.7 - virtual const Type *bottom_type() const { return Type::ABIO; } 22.8 + virtual const Type *bottom_type() const { return ( AllocatePrefetchStyle == 3 ) ? Type::MEMORY : Type::ABIO; } 22.9 };
23.1 --- a/src/share/vm/opto/runtime.cpp Fri Apr 09 15:01:49 2010 -0700 23.2 +++ b/src/share/vm/opto/runtime.cpp Tue Apr 13 13:01:37 2010 -0700 23.3 @@ -865,7 +865,7 @@ 23.4 thread->set_exception_stack_size(0); 23.5 23.6 // Check if the exception PC is a MethodHandle call site. 23.7 - thread->set_is_method_handle_exception(nm->is_method_handle_return(pc)); 23.8 + thread->set_is_method_handle_return(nm->is_method_handle_return(pc)); 23.9 } 23.10 23.11 // Restore correct return pc. Was saved above.
24.1 --- a/src/share/vm/runtime/globals.hpp Fri Apr 09 15:01:49 2010 -0700 24.2 +++ b/src/share/vm/runtime/globals.hpp Tue Apr 13 13:01:37 2010 -0700 24.3 @@ -1052,7 +1052,8 @@ 24.4 "Use SSE2 MOVDQU instruction for Arraycopy") \ 24.5 \ 24.6 product(intx, FieldsAllocationStyle, 1, \ 24.7 - "0 - type based with oops first, 1 - with oops last") \ 24.8 + "0 - type based with oops first, 1 - with oops last, " \ 24.9 + "2 - oops in super and sub classes are together") \ 24.10 \ 24.11 product(bool, CompactFields, true, \ 24.12 "Allocate nonstatic fields in gaps between previous fields") \ 24.13 @@ -2707,7 +2708,8 @@ 24.14 product(intx, AllocatePrefetchStyle, 1, \ 24.15 "0 = no prefetch, " \ 24.16 "1 = prefetch instructions for each allocation, " \ 24.17 - "2 = use TLAB watermark to gate allocation prefetch") \ 24.18 + "2 = use TLAB watermark to gate allocation prefetch, " \ 24.19 + "3 = use BIS instruction on Sparc for allocation prefetch") \ 24.20 \ 24.21 product(intx, AllocatePrefetchDistance, -1, \ 24.22 "Distance to prefetch ahead of allocation pointer") \ 24.23 @@ -3110,6 +3112,9 @@ 24.24 develop_pd(intx, CodeEntryAlignment, \ 24.25 "Code entry alignment for generated code (in bytes)") \ 24.26 \ 24.27 + product_pd(intx, OptoLoopAlignment, \ 24.28 + "Align inner loops to zero relative to this modulus") \ 24.29 + \ 24.30 product_pd(uintx, InitialCodeCacheSize, \ 24.31 "Initial code cache size (in bytes)") \ 24.32 \
25.1 --- a/src/share/vm/runtime/sharedRuntime.cpp Fri Apr 09 15:01:49 2010 -0700 25.2 +++ b/src/share/vm/runtime/sharedRuntime.cpp Tue Apr 13 13:01:37 2010 -0700 25.3 @@ -259,13 +259,16 @@ 25.4 address SharedRuntime::raw_exception_handler_for_return_address(JavaThread* thread, address return_address) { 25.5 assert(frame::verify_return_pc(return_address), "must be a return pc"); 25.6 25.7 + // Reset MethodHandle flag. 25.8 + thread->set_is_method_handle_return(false); 25.9 + 25.10 // the fastest case first 25.11 CodeBlob* blob = CodeCache::find_blob(return_address); 25.12 if (blob != NULL && blob->is_nmethod()) { 25.13 nmethod* code = (nmethod*)blob; 25.14 assert(code != NULL, "nmethod must be present"); 25.15 // Check if the return address is a MethodHandle call site. 25.16 - thread->set_is_method_handle_exception(code->is_method_handle_return(return_address)); 25.17 + thread->set_is_method_handle_return(code->is_method_handle_return(return_address)); 25.18 // native nmethods don't have exception handlers 25.19 assert(!code->is_native_method(), "no exception handler"); 25.20 assert(code->header_begin() != code->exception_begin(), "no exception handler"); 25.21 @@ -292,7 +295,7 @@ 25.22 nmethod* code = (nmethod*)blob; 25.23 assert(code != NULL, "nmethod must be present"); 25.24 // Check if the return address is a MethodHandle call site. 25.25 - thread->set_is_method_handle_exception(code->is_method_handle_return(return_address)); 25.26 + thread->set_is_method_handle_return(code->is_method_handle_return(return_address)); 25.27 assert(code->header_begin() != code->exception_begin(), "no exception handler"); 25.28 return code->exception_begin(); 25.29 }
26.1 --- a/src/share/vm/runtime/thread.hpp Fri Apr 09 15:01:49 2010 -0700 26.2 +++ b/src/share/vm/runtime/thread.hpp Tue Apr 13 13:01:37 2010 -0700 26.3 @@ -772,7 +772,7 @@ 26.4 volatile address _exception_pc; // PC where exception happened 26.5 volatile address _exception_handler_pc; // PC for handler of exception 26.6 volatile int _exception_stack_size; // Size of frame where exception happened 26.7 - volatile int _is_method_handle_exception; // True if the current exception PC is at a MethodHandle call. 26.8 + volatile int _is_method_handle_return; // true (== 1) if the current exception PC is a MethodHandle call site. 26.9 26.10 // support for compilation 26.11 bool _is_compiling; // is true if a compilation is active inthis thread (one compilation per thread possible) 26.12 @@ -1108,13 +1108,13 @@ 26.13 int exception_stack_size() const { return _exception_stack_size; } 26.14 address exception_pc() const { return _exception_pc; } 26.15 address exception_handler_pc() const { return _exception_handler_pc; } 26.16 - int is_method_handle_exception() const { return _is_method_handle_exception; } 26.17 + bool is_method_handle_return() const { return _is_method_handle_return == 1; } 26.18 26.19 void set_exception_oop(oop o) { _exception_oop = o; } 26.20 void set_exception_pc(address a) { _exception_pc = a; } 26.21 void set_exception_handler_pc(address a) { _exception_handler_pc = a; } 26.22 void set_exception_stack_size(int size) { _exception_stack_size = size; } 26.23 - void set_is_method_handle_exception(int value) { _is_method_handle_exception = value; } 26.24 + void set_is_method_handle_return(bool value) { _is_method_handle_return = value ? 1 : 0; } 26.25 26.26 // Stack overflow support 26.27 inline size_t stack_available(address cur_sp); 26.28 @@ -1188,7 +1188,7 @@ 26.29 static ByteSize exception_pc_offset() { return byte_offset_of(JavaThread, _exception_pc ); } 26.30 static ByteSize exception_handler_pc_offset() { return byte_offset_of(JavaThread, _exception_handler_pc); } 26.31 static ByteSize exception_stack_size_offset() { return byte_offset_of(JavaThread, _exception_stack_size); } 26.32 - static ByteSize is_method_handle_exception_offset() { return byte_offset_of(JavaThread, _is_method_handle_exception); } 26.33 + static ByteSize is_method_handle_return_offset() { return byte_offset_of(JavaThread, _is_method_handle_return); } 26.34 static ByteSize stack_guard_state_offset() { return byte_offset_of(JavaThread, _stack_guard_state ); } 26.35 static ByteSize suspend_flags_offset() { return byte_offset_of(JavaThread, _suspend_flags ); } 26.36