Thu, 07 Nov 2013 11:47:11 +0100
8027968: Adapt PPC to 8024927: Nashorn performance regression with CompressedOops
Reviewed-by: coleenp, kvn
1.1 --- a/src/cpu/ppc/vm/macroAssembler_ppc.cpp Thu Nov 07 11:51:53 2013 +0100 1.2 +++ b/src/cpu/ppc/vm/macroAssembler_ppc.cpp Thu Nov 07 11:47:11 2013 +0100 1.3 @@ -2382,10 +2382,12 @@ 1.4 1.5 void MacroAssembler::encode_klass_not_null(Register dst, Register src) { 1.6 if (src == noreg) src = dst; 1.7 - assert(Universe::narrow_klass_base() != NULL, "Base should be initialized"); 1.8 - load_const(R0, Universe::narrow_klass_base()); 1.9 - sub(dst, src, R0); 1.10 - if (Universe::narrow_klass_shift() != 0) { 1.11 + if (Universe::narrow_klass_base() != 0) { 1.12 + load_const(R0, Universe::narrow_klass_base()); 1.13 + sub(dst, src, R0); 1.14 + } 1.15 + if (Universe::narrow_klass_shift() != 0 || 1.16 + Universe::narrow_klass_base() == 0 && src != dst) { // Move required. 1.17 srdi(dst, src, Universe::narrow_klass_shift()); 1.18 } 1.19 } 1.20 @@ -2399,16 +2401,25 @@ 1.21 } 1.22 } 1.23 1.24 +int MacroAssembler::instr_size_for_decode_klass_not_null() { 1.25 + if (!UseCompressedClassPointers) return 0; 1.26 + int num_instrs = 1; // shift or move 1.27 + if (Universe::narrow_klass_base() != 0) num_instrs = 7; // shift + load const + add 1.28 + return num_instrs * BytesPerInstWord; 1.29 +} 1.30 + 1.31 void MacroAssembler::decode_klass_not_null(Register dst, Register src) { 1.32 if (src == noreg) src = dst; 1.33 Register shifted_src = src; 1.34 - assert(Universe::narrow_klass_base() != NULL, "Base should be initialized"); 1.35 - if (Universe::narrow_klass_shift() != 0) { 1.36 + if (Universe::narrow_klass_shift() != 0 || 1.37 + Universe::narrow_klass_base() == 0 && src != dst) { // Move required. 1.38 shifted_src = dst; 1.39 sldi(shifted_src, src, Universe::narrow_klass_shift()); 1.40 } 1.41 - load_const(R0, Universe::narrow_klass_base()); 1.42 - add(dst, shifted_src, R0); 1.43 + if (Universe::narrow_klass_base() != 0) { 1.44 + load_const(R0, Universe::narrow_klass_base()); 1.45 + add(dst, shifted_src, R0); 1.46 + } 1.47 } 1.48 1.49 void MacroAssembler::load_klass(Register dst, Register src) {
2.1 --- a/src/cpu/ppc/vm/macroAssembler_ppc.hpp Thu Nov 07 11:51:53 2013 +0100 2.2 +++ b/src/cpu/ppc/vm/macroAssembler_ppc.hpp Thu Nov 07 11:47:11 2013 +0100 2.3 @@ -551,6 +551,7 @@ 2.4 void load_klass(Register dst, Register src); 2.5 void load_klass_with_trap_null_check(Register dst, Register src); 2.6 void store_klass(Register dst_oop, Register klass, Register tmp = R0); 2.7 + static int instr_size_for_decode_klass_not_null(); 2.8 void decode_klass_not_null(Register dst, Register src = noreg); 2.9 void encode_klass_not_null(Register dst, Register src = noreg); 2.10
3.1 --- a/src/cpu/ppc/vm/vtableStubs_ppc_64.cpp Thu Nov 07 11:51:53 2013 +0100 3.2 +++ b/src/cpu/ppc/vm/vtableStubs_ppc_64.cpp Thu Nov 07 11:47:11 2013 +0100 3.3 @@ -255,10 +255,11 @@ 3.4 if (TraceJumps || DebugVtables || CountCompiledCalls || VerifyOops) { 3.5 return 1000; 3.6 } else { 3.7 + int decode_klass_size = MacroAssembler::instr_size_for_decode_klass_not_null(); 3.8 if (is_vtable_stub) { 3.9 - return 20 + 16 + 8; // Plain + (cOops & Traps) + safety 3.10 + return 20 + decode_klass_size + 8 + 8; // Plain + cOops + Traps + safety 3.11 } else { 3.12 - return 16 + 96; 3.13 + return 96 + decode_klass_size + 12 + 8; // Plain + cOops + Traps + safety 3.14 } 3.15 } 3.16 }