1.1 --- a/src/cpu/x86/vm/macroAssembler_x86.cpp Fri Oct 25 11:13:11 2013 -0400 1.2 +++ b/src/cpu/x86/vm/macroAssembler_x86.cpp Fri Oct 25 15:19:29 2013 -0400 1.3 @@ -5049,25 +5049,32 @@ 1.4 } 1.5 1.6 void MacroAssembler::encode_klass_not_null(Register r) { 1.7 - assert(Universe::narrow_klass_base() != NULL, "Base should be initialized"); 1.8 - // Use r12 as a scratch register in which to temporarily load the narrow_klass_base. 1.9 - assert(r != r12_heapbase, "Encoding a klass in r12"); 1.10 - mov64(r12_heapbase, (int64_t)Universe::narrow_klass_base()); 1.11 - subq(r, r12_heapbase); 1.12 + if (Universe::narrow_klass_base() != NULL) { 1.13 + // Use r12 as a scratch register in which to temporarily load the narrow_klass_base. 1.14 + assert(r != r12_heapbase, "Encoding a klass in r12"); 1.15 + mov64(r12_heapbase, (int64_t)Universe::narrow_klass_base()); 1.16 + subq(r, r12_heapbase); 1.17 + } 1.18 if (Universe::narrow_klass_shift() != 0) { 1.19 assert (LogKlassAlignmentInBytes == Universe::narrow_klass_shift(), "decode alg wrong"); 1.20 shrq(r, LogKlassAlignmentInBytes); 1.21 } 1.22 - reinit_heapbase(); 1.23 + if (Universe::narrow_klass_base() != NULL) { 1.24 + reinit_heapbase(); 1.25 + } 1.26 } 1.27 1.28 void MacroAssembler::encode_klass_not_null(Register dst, Register src) { 1.29 if (dst == src) { 1.30 encode_klass_not_null(src); 1.31 } else { 1.32 - mov64(dst, (int64_t)Universe::narrow_klass_base()); 1.33 - negq(dst); 1.34 - addq(dst, src); 1.35 + if (Universe::narrow_klass_base() != NULL) { 1.36 + mov64(dst, (int64_t)Universe::narrow_klass_base()); 1.37 + negq(dst); 1.38 + addq(dst, src); 1.39 + } else { 1.40 + movptr(dst, src); 1.41 + } 1.42 if (Universe::narrow_klass_shift() != 0) { 1.43 assert (LogKlassAlignmentInBytes == Universe::narrow_klass_shift(), "decode alg wrong"); 1.44 shrq(dst, LogKlassAlignmentInBytes); 1.45 @@ -5081,15 +5088,19 @@ 1.46 // generate change, then this method needs to be updated. 1.47 int MacroAssembler::instr_size_for_decode_klass_not_null() { 1.48 assert (UseCompressedClassPointers, "only for compressed klass ptrs"); 1.49 - // mov64 + addq + shlq? + mov64 (for reinit_heapbase()). 1.50 - return (Universe::narrow_klass_shift() == 0 ? 20 : 24); 1.51 + if (Universe::narrow_klass_base() != NULL) { 1.52 + // mov64 + addq + shlq? + mov64 (for reinit_heapbase()). 1.53 + return (Universe::narrow_klass_shift() == 0 ? 20 : 24); 1.54 + } else { 1.55 + // longest load decode klass function, mov64, leaq 1.56 + return 16; 1.57 + } 1.58 } 1.59 1.60 // !!! If the instructions that get generated here change then function 1.61 // instr_size_for_decode_klass_not_null() needs to get updated. 1.62 void MacroAssembler::decode_klass_not_null(Register r) { 1.63 // Note: it will change flags 1.64 - assert(Universe::narrow_klass_base() != NULL, "Base should be initialized"); 1.65 assert (UseCompressedClassPointers, "should only be used for compressed headers"); 1.66 assert(r != r12_heapbase, "Decoding a klass in r12"); 1.67 // Cannot assert, unverified entry point counts instructions (see .ad file) 1.68 @@ -5100,14 +5111,15 @@ 1.69 shlq(r, LogKlassAlignmentInBytes); 1.70 } 1.71 // Use r12 as a scratch register in which to temporarily load the narrow_klass_base. 1.72 - mov64(r12_heapbase, (int64_t)Universe::narrow_klass_base()); 1.73 - addq(r, r12_heapbase); 1.74 - reinit_heapbase(); 1.75 + if (Universe::narrow_klass_base() != NULL) { 1.76 + mov64(r12_heapbase, (int64_t)Universe::narrow_klass_base()); 1.77 + addq(r, r12_heapbase); 1.78 + reinit_heapbase(); 1.79 + } 1.80 } 1.81 1.82 void MacroAssembler::decode_klass_not_null(Register dst, Register src) { 1.83 // Note: it will change flags 1.84 - assert(Universe::narrow_klass_base() != NULL, "Base should be initialized"); 1.85 assert (UseCompressedClassPointers, "should only be used for compressed headers"); 1.86 if (dst == src) { 1.87 decode_klass_not_null(dst); 1.88 @@ -5115,7 +5127,6 @@ 1.89 // Cannot assert, unverified entry point counts instructions (see .ad file) 1.90 // vtableStubs also counts instructions in pd_code_size_limit. 1.91 // Also do not verify_oop as this is called by verify_oop. 1.92 - 1.93 mov64(dst, (int64_t)Universe::narrow_klass_base()); 1.94 if (Universe::narrow_klass_shift() != 0) { 1.95 assert(LogKlassAlignmentInBytes == Universe::narrow_klass_shift(), "decode alg wrong");