< prev index next >

src/hotspot/share/opto/library_call.cpp

Print this page

4368   // Get the header out of the object, use LoadMarkNode when available
4369   Node* header_addr = basic_plus_adr(obj, oopDesc::mark_offset_in_bytes());
4370   // The control of the load must be null. Otherwise, the load can move before
4371   // the null check after castPP removal.
4372   Node* no_ctrl = nullptr;
4373   Node* header = make_load(no_ctrl, header_addr, TypeX_X, TypeX_X->basic_type(), MemNode::unordered);
4374 
4375   // Test the header to see if it is unlocked.
4376   Node *lock_mask      = _gvn.MakeConX(markWord::lock_mask_in_place);
4377   Node *lmasked_header = _gvn.transform(new AndXNode(header, lock_mask));
4378   Node *unlocked_val   = _gvn.MakeConX(markWord::unlocked_value);
4379   Node *chk_unlocked   = _gvn.transform(new CmpXNode( lmasked_header, unlocked_val));
4380   Node *test_unlocked  = _gvn.transform(new BoolNode( chk_unlocked, BoolTest::ne));
4381 
4382   generate_slow_guard(test_unlocked, slow_region);
4383 
4384   // Get the hash value and check to see that it has been properly assigned.
4385   // We depend on hash_mask being at most 32 bits and avoid the use of
4386   // hash_mask_in_place because it could be larger than 32 bits in a 64-bit
4387   // vm: see markWord.hpp.
4388   Node *hash_mask      = _gvn.intcon(markWord::hash_mask);
4389   Node *hash_shift     = _gvn.intcon(markWord::hash_shift);
4390   Node *hshifted_header= _gvn.transform(new URShiftXNode(header, hash_shift));
4391   // This hack lets the hash bits live anywhere in the mark object now, as long
4392   // as the shift drops the relevant bits into the low 32 bits.  Note that
4393   // Java spec says that HashCode is an int so there's no point in capturing
4394   // an 'X'-sized hashcode (32 in 32-bit build or 64 in 64-bit build).
4395   hshifted_header      = ConvX2I(hshifted_header);
4396   Node *hash_val       = _gvn.transform(new AndINode(hshifted_header, hash_mask));
4397 
4398   Node *no_hash_val    = _gvn.intcon(markWord::no_hash);
4399   Node *chk_assigned   = _gvn.transform(new CmpINode( hash_val, no_hash_val));
4400   Node *test_assigned  = _gvn.transform(new BoolNode( chk_assigned, BoolTest::eq));
4401 
4402   generate_slow_guard(test_assigned, slow_region);
4403 
4404   Node* init_mem = reset_memory();
4405   // fill in the rest of the null path:
4406   result_io ->init_req(_null_path, i_o());
4407   result_mem->init_req(_null_path, init_mem);
4408 
4409   result_val->init_req(_fast_path, hash_val);

4368   // Get the header out of the object, use LoadMarkNode when available
4369   Node* header_addr = basic_plus_adr(obj, oopDesc::mark_offset_in_bytes());
4370   // The control of the load must be null. Otherwise, the load can move before
4371   // the null check after castPP removal.
4372   Node* no_ctrl = nullptr;
4373   Node* header = make_load(no_ctrl, header_addr, TypeX_X, TypeX_X->basic_type(), MemNode::unordered);
4374 
4375   // Test the header to see if it is unlocked.
4376   Node *lock_mask      = _gvn.MakeConX(markWord::lock_mask_in_place);
4377   Node *lmasked_header = _gvn.transform(new AndXNode(header, lock_mask));
4378   Node *unlocked_val   = _gvn.MakeConX(markWord::unlocked_value);
4379   Node *chk_unlocked   = _gvn.transform(new CmpXNode( lmasked_header, unlocked_val));
4380   Node *test_unlocked  = _gvn.transform(new BoolNode( chk_unlocked, BoolTest::ne));
4381 
4382   generate_slow_guard(test_unlocked, slow_region);
4383 
4384   // Get the hash value and check to see that it has been properly assigned.
4385   // We depend on hash_mask being at most 32 bits and avoid the use of
4386   // hash_mask_in_place because it could be larger than 32 bits in a 64-bit
4387   // vm: see markWord.hpp.
4388   Node *hash_mask      = _gvn.intcon(UseCompactObjectHeaders ? markWord::hash_mask_compact  : markWord::hash_mask);
4389   Node *hash_shift     = _gvn.intcon(UseCompactObjectHeaders ? markWord::hash_shift_compact : markWord::hash_shift);
4390   Node *hshifted_header= _gvn.transform(new URShiftXNode(header, hash_shift));
4391   // This hack lets the hash bits live anywhere in the mark object now, as long
4392   // as the shift drops the relevant bits into the low 32 bits.  Note that
4393   // Java spec says that HashCode is an int so there's no point in capturing
4394   // an 'X'-sized hashcode (32 in 32-bit build or 64 in 64-bit build).
4395   hshifted_header      = ConvX2I(hshifted_header);
4396   Node *hash_val       = _gvn.transform(new AndINode(hshifted_header, hash_mask));
4397 
4398   Node *no_hash_val    = _gvn.intcon(markWord::no_hash);
4399   Node *chk_assigned   = _gvn.transform(new CmpINode( hash_val, no_hash_val));
4400   Node *test_assigned  = _gvn.transform(new BoolNode( chk_assigned, BoolTest::eq));
4401 
4402   generate_slow_guard(test_assigned, slow_region);
4403 
4404   Node* init_mem = reset_memory();
4405   // fill in the rest of the null path:
4406   result_io ->init_req(_null_path, i_o());
4407   result_mem->init_req(_null_path, init_mem);
4408 
4409   result_val->init_req(_fast_path, hash_val);
< prev index next >