hotspot/src/cpu/x86/vm/c1_LIRAssembler_x86.cpp
changeset 3908 24b55ad4c228
parent 2867 69187054225f
child 4430 95b539dfa1e8
equal deleted inserted replaced
3906:6767b0c66883 3908:24b55ad4c228
  1636     assert_different_registers(obj, k_RInfo, klass_RInfo);
  1636     assert_different_registers(obj, k_RInfo, klass_RInfo);
  1637     if (!k->is_loaded()) {
  1637     if (!k->is_loaded()) {
  1638       jobject2reg_with_patching(k_RInfo, op->info_for_patch());
  1638       jobject2reg_with_patching(k_RInfo, op->info_for_patch());
  1639     } else {
  1639     } else {
  1640 #ifdef _LP64
  1640 #ifdef _LP64
  1641       __ movoop(k_RInfo, k->encoding());
  1641       __ movoop(k_RInfo, k->constant_encoding());
  1642 #else
  1642 #else
  1643       k_RInfo = noreg;
  1643       k_RInfo = noreg;
  1644 #endif // _LP64
  1644 #endif // _LP64
  1645     }
  1645     }
  1646     assert(obj != k_RInfo, "must be different");
  1646     assert(obj != k_RInfo, "must be different");
  1659       }
  1659       }
  1660       ciProfileData* data = md->bci_to_data(bci);
  1660       ciProfileData* data = md->bci_to_data(bci);
  1661       assert(data != NULL,       "need data for checkcast");
  1661       assert(data != NULL,       "need data for checkcast");
  1662       assert(data->is_BitData(), "need BitData for checkcast");
  1662       assert(data->is_BitData(), "need BitData for checkcast");
  1663       Register mdo  = klass_RInfo;
  1663       Register mdo  = klass_RInfo;
  1664       __ movoop(mdo, md->encoding());
  1664       __ movoop(mdo, md->constant_encoding());
  1665       Address data_addr(mdo, md->byte_offset_of_slot(data, DataLayout::header_offset()));
  1665       Address data_addr(mdo, md->byte_offset_of_slot(data, DataLayout::header_offset()));
  1666       int header_bits = DataLayout::flag_mask_to_header_mask(BitData::null_seen_byte_constant());
  1666       int header_bits = DataLayout::flag_mask_to_header_mask(BitData::null_seen_byte_constant());
  1667       __ orl(data_addr, header_bits);
  1667       __ orl(data_addr, header_bits);
  1668       __ jmp(done);
  1668       __ jmp(done);
  1669       __ bind(profile_done);
  1669       __ bind(profile_done);
  1677       // not a safepoint as obj null check happens earlier
  1677       // not a safepoint as obj null check happens earlier
  1678       if (k->is_loaded()) {
  1678       if (k->is_loaded()) {
  1679 #ifdef _LP64
  1679 #ifdef _LP64
  1680         __ cmpptr(k_RInfo, Address(obj, oopDesc::klass_offset_in_bytes()));
  1680         __ cmpptr(k_RInfo, Address(obj, oopDesc::klass_offset_in_bytes()));
  1681 #else
  1681 #else
  1682         __ cmpoop(Address(obj, oopDesc::klass_offset_in_bytes()), k->encoding());
  1682         __ cmpoop(Address(obj, oopDesc::klass_offset_in_bytes()), k->constant_encoding());
  1683 #endif // _LP64
  1683 #endif // _LP64
  1684       } else {
  1684       } else {
  1685         __ cmpptr(k_RInfo, Address(obj, oopDesc::klass_offset_in_bytes()));
  1685         __ cmpptr(k_RInfo, Address(obj, oopDesc::klass_offset_in_bytes()));
  1686 
  1686 
  1687       }
  1687       }
  1694       if (k->is_loaded()) {
  1694       if (k->is_loaded()) {
  1695         // See if we get an immediate positive hit
  1695         // See if we get an immediate positive hit
  1696 #ifdef _LP64
  1696 #ifdef _LP64
  1697         __ cmpptr(k_RInfo, Address(klass_RInfo, k->super_check_offset()));
  1697         __ cmpptr(k_RInfo, Address(klass_RInfo, k->super_check_offset()));
  1698 #else
  1698 #else
  1699         __ cmpoop(Address(klass_RInfo, k->super_check_offset()), k->encoding());
  1699         __ cmpoop(Address(klass_RInfo, k->super_check_offset()), k->constant_encoding());
  1700 #endif // _LP64
  1700 #endif // _LP64
  1701         if (sizeof(oopDesc) + Klass::secondary_super_cache_offset_in_bytes() != k->super_check_offset()) {
  1701         if (sizeof(oopDesc) + Klass::secondary_super_cache_offset_in_bytes() != k->super_check_offset()) {
  1702           __ jcc(Assembler::notEqual, *stub->entry());
  1702           __ jcc(Assembler::notEqual, *stub->entry());
  1703         } else {
  1703         } else {
  1704           // See if we get an immediate positive hit
  1704           // See if we get an immediate positive hit
  1705           __ jcc(Assembler::equal, done);
  1705           __ jcc(Assembler::equal, done);
  1706           // check for self
  1706           // check for self
  1707 #ifdef _LP64
  1707 #ifdef _LP64
  1708           __ cmpptr(klass_RInfo, k_RInfo);
  1708           __ cmpptr(klass_RInfo, k_RInfo);
  1709 #else
  1709 #else
  1710           __ cmpoop(klass_RInfo, k->encoding());
  1710           __ cmpoop(klass_RInfo, k->constant_encoding());
  1711 #endif // _LP64
  1711 #endif // _LP64
  1712           __ jcc(Assembler::equal, done);
  1712           __ jcc(Assembler::equal, done);
  1713 
  1713 
  1714           __ push(klass_RInfo);
  1714           __ push(klass_RInfo);
  1715 #ifdef _LP64
  1715 #ifdef _LP64
  1716           __ push(k_RInfo);
  1716           __ push(k_RInfo);
  1717 #else
  1717 #else
  1718           __ pushoop(k->encoding());
  1718           __ pushoop(k->constant_encoding());
  1719 #endif // _LP64
  1719 #endif // _LP64
  1720           __ call(RuntimeAddress(Runtime1::entry_for(Runtime1::slow_subtype_check_id)));
  1720           __ call(RuntimeAddress(Runtime1::entry_for(Runtime1::slow_subtype_check_id)));
  1721           __ pop(klass_RInfo);
  1721           __ pop(klass_RInfo);
  1722           __ pop(klass_RInfo);
  1722           __ pop(klass_RInfo);
  1723           // result is a boolean
  1723           // result is a boolean
  1761     // patching may screw with our temporaries on sparc,
  1761     // patching may screw with our temporaries on sparc,
  1762     // so let's do it before loading the class
  1762     // so let's do it before loading the class
  1763     if (!k->is_loaded()) {
  1763     if (!k->is_loaded()) {
  1764       jobject2reg_with_patching(k_RInfo, op->info_for_patch());
  1764       jobject2reg_with_patching(k_RInfo, op->info_for_patch());
  1765     } else {
  1765     } else {
  1766       LP64_ONLY(__ movoop(k_RInfo, k->encoding()));
  1766       LP64_ONLY(__ movoop(k_RInfo, k->constant_encoding()));
  1767     }
  1767     }
  1768     assert(obj != k_RInfo, "must be different");
  1768     assert(obj != k_RInfo, "must be different");
  1769 
  1769 
  1770     __ verify_oop(obj);
  1770     __ verify_oop(obj);
  1771     if (op->fast_check()) {
  1771     if (op->fast_check()) {
  1772       __ cmpptr(obj, (int32_t)NULL_WORD);
  1772       __ cmpptr(obj, (int32_t)NULL_WORD);
  1773       __ jcc(Assembler::equal, zero);
  1773       __ jcc(Assembler::equal, zero);
  1774       // get object class
  1774       // get object class
  1775       // not a safepoint as obj null check happens earlier
  1775       // not a safepoint as obj null check happens earlier
  1776       if (LP64_ONLY(false &&) k->is_loaded()) {
  1776       if (LP64_ONLY(false &&) k->is_loaded()) {
  1777         NOT_LP64(__ cmpoop(Address(obj, oopDesc::klass_offset_in_bytes()), k->encoding()));
  1777         NOT_LP64(__ cmpoop(Address(obj, oopDesc::klass_offset_in_bytes()), k->constant_encoding()));
  1778         k_RInfo = noreg;
  1778         k_RInfo = noreg;
  1779       } else {
  1779       } else {
  1780         __ cmpptr(k_RInfo, Address(obj, oopDesc::klass_offset_in_bytes()));
  1780         __ cmpptr(k_RInfo, Address(obj, oopDesc::klass_offset_in_bytes()));
  1781 
  1781 
  1782       }
  1782       }
  1789       __ movptr(klass_RInfo, Address(obj, oopDesc::klass_offset_in_bytes()));
  1789       __ movptr(klass_RInfo, Address(obj, oopDesc::klass_offset_in_bytes()));
  1790 
  1790 
  1791 #ifndef _LP64
  1791 #ifndef _LP64
  1792       if (k->is_loaded()) {
  1792       if (k->is_loaded()) {
  1793         // See if we get an immediate positive hit
  1793         // See if we get an immediate positive hit
  1794         __ cmpoop(Address(klass_RInfo, k->super_check_offset()), k->encoding());
  1794         __ cmpoop(Address(klass_RInfo, k->super_check_offset()), k->constant_encoding());
  1795         __ jcc(Assembler::equal, one);
  1795         __ jcc(Assembler::equal, one);
  1796         if (sizeof(oopDesc) + Klass::secondary_super_cache_offset_in_bytes() == k->super_check_offset()) {
  1796         if (sizeof(oopDesc) + Klass::secondary_super_cache_offset_in_bytes() == k->super_check_offset()) {
  1797           // check for self
  1797           // check for self
  1798           __ cmpoop(klass_RInfo, k->encoding());
  1798           __ cmpoop(klass_RInfo, k->constant_encoding());
  1799           __ jcc(Assembler::equal, one);
  1799           __ jcc(Assembler::equal, one);
  1800           __ push(klass_RInfo);
  1800           __ push(klass_RInfo);
  1801           __ pushoop(k->encoding());
  1801           __ pushoop(k->constant_encoding());
  1802           __ call(RuntimeAddress(Runtime1::entry_for(Runtime1::slow_subtype_check_id)));
  1802           __ call(RuntimeAddress(Runtime1::entry_for(Runtime1::slow_subtype_check_id)));
  1803           __ pop(klass_RInfo);
  1803           __ pop(klass_RInfo);
  1804           __ pop(dst);
  1804           __ pop(dst);
  1805           __ jmp(done);
  1805           __ jmp(done);
  1806         }
  1806         }
  3110     // object array case, if no type check is needed then either the
  3110     // object array case, if no type check is needed then either the
  3111     // dst type is exactly the expected type and the src type is a
  3111     // dst type is exactly the expected type and the src type is a
  3112     // subtype which we can't check or src is the same array as dst
  3112     // subtype which we can't check or src is the same array as dst
  3113     // but not necessarily exactly of type default_type.
  3113     // but not necessarily exactly of type default_type.
  3114     Label known_ok, halt;
  3114     Label known_ok, halt;
  3115     __ movoop(tmp, default_type->encoding());
  3115     __ movoop(tmp, default_type->constant_encoding());
  3116     if (basic_type != T_OBJECT) {
  3116     if (basic_type != T_OBJECT) {
  3117       __ cmpptr(tmp, dst_klass_addr);
  3117       __ cmpptr(tmp, dst_klass_addr);
  3118       __ jcc(Assembler::notEqual, halt);
  3118       __ jcc(Assembler::notEqual, halt);
  3119       __ cmpptr(tmp, src_klass_addr);
  3119       __ cmpptr(tmp, src_klass_addr);
  3120       __ jcc(Assembler::equal, known_ok);
  3120       __ jcc(Assembler::equal, known_ok);
  3198   }
  3198   }
  3199   ciProfileData* data = md->bci_to_data(bci);
  3199   ciProfileData* data = md->bci_to_data(bci);
  3200   assert(data->is_CounterData(), "need CounterData for calls");
  3200   assert(data->is_CounterData(), "need CounterData for calls");
  3201   assert(op->mdo()->is_single_cpu(),  "mdo must be allocated");
  3201   assert(op->mdo()->is_single_cpu(),  "mdo must be allocated");
  3202   Register mdo  = op->mdo()->as_register();
  3202   Register mdo  = op->mdo()->as_register();
  3203   __ movoop(mdo, md->encoding());
  3203   __ movoop(mdo, md->constant_encoding());
  3204   Address counter_addr(mdo, md->byte_offset_of_slot(data, CounterData::count_offset()));
  3204   Address counter_addr(mdo, md->byte_offset_of_slot(data, CounterData::count_offset()));
  3205   __ addl(counter_addr, DataLayout::counter_increment);
  3205   __ addl(counter_addr, DataLayout::counter_increment);
  3206   Bytecodes::Code bc = method->java_code_at_bci(bci);
  3206   Bytecodes::Code bc = method->java_code_at_bci(bci);
  3207   // Perform additional virtual call profiling for invokevirtual and
  3207   // Perform additional virtual call profiling for invokevirtual and
  3208   // invokeinterface bytecodes
  3208   // invokeinterface bytecodes
  3238       // VirtualCallData rather than just the first time
  3238       // VirtualCallData rather than just the first time
  3239       for (i = 0; i < VirtualCallData::row_limit(); i++) {
  3239       for (i = 0; i < VirtualCallData::row_limit(); i++) {
  3240         ciKlass* receiver = vc_data->receiver(i);
  3240         ciKlass* receiver = vc_data->receiver(i);
  3241         if (receiver == NULL) {
  3241         if (receiver == NULL) {
  3242           Address recv_addr(mdo, md->byte_offset_of_slot(data, VirtualCallData::receiver_offset(i)));
  3242           Address recv_addr(mdo, md->byte_offset_of_slot(data, VirtualCallData::receiver_offset(i)));
  3243           __ movoop(recv_addr, known_klass->encoding());
  3243           __ movoop(recv_addr, known_klass->constant_encoding());
  3244           Address data_addr(mdo, md->byte_offset_of_slot(data, VirtualCallData::receiver_count_offset(i)));
  3244           Address data_addr(mdo, md->byte_offset_of_slot(data, VirtualCallData::receiver_count_offset(i)));
  3245           __ addl(data_addr, DataLayout::counter_increment);
  3245           __ addl(data_addr, DataLayout::counter_increment);
  3246           return;
  3246           return;
  3247         }
  3247         }
  3248       }
  3248       }