< prev index next >

src/hotspot/cpu/x86/sharedRuntime_x86.cpp

Print this page

 40 // Since hashCode is usually polymorphic at call sites we can't do this
 41 // optimization at the call site without a lot of work.
 42 void SharedRuntime::inline_check_hashcode_from_object_header(MacroAssembler* masm,
 43                                  const methodHandle& method,
 44                                  Register obj_reg,
 45                                  Register result) {
 46   Label slowCase;
 47 
 48   // Unlike for Object.hashCode, System.identityHashCode is static method and
 49   // gets object as argument instead of the receiver.
 50   if (method->intrinsic_id() == vmIntrinsics::_identityHashCode) {
 51     Label Continue;
 52     // return 0 for null reference input
 53     __ cmpptr(obj_reg, NULL_WORD);
 54     __ jcc(Assembler::notEqual, Continue);
 55     __ xorptr(result, result);
 56     __ ret(0);
 57     __ bind(Continue);
 58   }
 59 





 60   __ movptr(result, Address(obj_reg, oopDesc::mark_offset_in_bytes()));
 61 
 62 
 63   if (LockingMode == LM_LIGHTWEIGHT) {
 64     if (!UseObjectMonitorTable) {
 65       // check if monitor
 66       __ testptr(result, markWord::monitor_value);
 67       __ jcc(Assembler::notZero, slowCase);
 68     }
 69   } else {
 70     // check if locked
 71     __ testptr(result, markWord::unlocked_value);
 72     __ jcc(Assembler::zero, slowCase);
 73   }
 74 
 75   // get hash
 76 #ifdef _LP64
 77   // Read the header and build a mask to get its hash field.
 78   // Depend on hash_mask being at most 32 bits and avoid the use of hash_mask_in_place
 79   // because it could be larger than 32 bits in a 64-bit vm. See markWord.hpp.

 40 // Since hashCode is usually polymorphic at call sites we can't do this
 41 // optimization at the call site without a lot of work.
 42 void SharedRuntime::inline_check_hashcode_from_object_header(MacroAssembler* masm,
 43                                  const methodHandle& method,
 44                                  Register obj_reg,
 45                                  Register result) {
 46   Label slowCase;
 47 
 48   // Unlike for Object.hashCode, System.identityHashCode is static method and
 49   // gets object as argument instead of the receiver.
 50   if (method->intrinsic_id() == vmIntrinsics::_identityHashCode) {
 51     Label Continue;
 52     // return 0 for null reference input
 53     __ cmpptr(obj_reg, NULL_WORD);
 54     __ jcc(Assembler::notEqual, Continue);
 55     __ xorptr(result, result);
 56     __ ret(0);
 57     __ bind(Continue);
 58   }
 59 
 60   if (UseCompactObjectHeaders) {
 61     // Don't generate anything else and always take the slow-path for now.
 62     return;
 63   }
 64 
 65   __ movptr(result, Address(obj_reg, oopDesc::mark_offset_in_bytes()));
 66 
 67 
 68   if (LockingMode == LM_LIGHTWEIGHT) {
 69     if (!UseObjectMonitorTable) {
 70       // check if monitor
 71       __ testptr(result, markWord::monitor_value);
 72       __ jcc(Assembler::notZero, slowCase);
 73     }
 74   } else {
 75     // check if locked
 76     __ testptr(result, markWord::unlocked_value);
 77     __ jcc(Assembler::zero, slowCase);
 78   }
 79 
 80   // get hash
 81 #ifdef _LP64
 82   // Read the header and build a mask to get its hash field.
 83   // Depend on hash_mask being at most 32 bits and avoid the use of hash_mask_in_place
 84   // because it could be larger than 32 bits in a 64-bit vm. See markWord.hpp.
< prev index next >