1372 // one less register, because needed values are on the argument stack. |
1372 // one less register, because needed values are on the argument stack. |
1373 // __ check_klass_subtype_fast_path(sub_klass, *super_klass*, temp, |
1373 // __ check_klass_subtype_fast_path(sub_klass, *super_klass*, temp, |
1374 // L_success, L_failure, NULL); |
1374 // L_success, L_failure, NULL); |
1375 assert_different_registers(sub_klass, temp); |
1375 assert_different_registers(sub_klass, temp); |
1376 |
1376 |
1377 int sc_offset = (klassOopDesc::header_size() * HeapWordSize + |
1377 int sc_offset = in_bytes(Klass::secondary_super_cache_offset()); |
1378 Klass::secondary_super_cache_offset_in_bytes()); |
|
1379 |
1378 |
1380 // if the pointers are equal, we are done (e.g., String[] elements) |
1379 // if the pointers are equal, we are done (e.g., String[] elements) |
1381 __ cmpptr(sub_klass, super_klass_addr); |
1380 __ cmpptr(sub_klass, super_klass_addr); |
1382 LOCAL_JCC(Assembler::equal, L_success); |
1381 LOCAL_JCC(Assembler::equal, L_success); |
1383 |
1382 |
1785 // 32 30 24 16 8 2 0 |
1784 // 32 30 24 16 8 2 0 |
1786 // |
1785 // |
1787 // array_tag: typeArray = 0x3, objArray = 0x2, non-array = 0x0 |
1786 // array_tag: typeArray = 0x3, objArray = 0x2, non-array = 0x0 |
1788 // |
1787 // |
1789 |
1788 |
1790 int lh_offset = klassOopDesc::header_size() * HeapWordSize + |
1789 int lh_offset = in_bytes(Klass::layout_helper_offset()); |
1791 Klass::layout_helper_offset_in_bytes(); |
|
1792 Address src_klass_lh_addr(rcx_src_klass, lh_offset); |
1790 Address src_klass_lh_addr(rcx_src_klass, lh_offset); |
1793 |
1791 |
1794 // Handle objArrays completely differently... |
1792 // Handle objArrays completely differently... |
1795 jint objArray_lh = Klass::array_layout_helper(T_OBJECT); |
1793 jint objArray_lh = Klass::array_layout_helper(T_OBJECT); |
1796 __ cmpl(src_klass_lh_addr, objArray_lh); |
1794 __ cmpl(src_klass_lh_addr, objArray_lh); |
1912 |
1910 |
1913 __ BIND(L_checkcast_copy); |
1911 __ BIND(L_checkcast_copy); |
1914 // live at this point: rcx_src_klass, dst[_pos], src[_pos] |
1912 // live at this point: rcx_src_klass, dst[_pos], src[_pos] |
1915 { |
1913 { |
1916 // Handy offsets: |
1914 // Handy offsets: |
1917 int ek_offset = (klassOopDesc::header_size() * HeapWordSize + |
1915 int ek_offset = in_bytes(objArrayKlass::element_klass_offset()); |
1918 objArrayKlass::element_klass_offset_in_bytes()); |
1916 int sco_offset = in_bytes(Klass::super_check_offset_offset()); |
1919 int sco_offset = (klassOopDesc::header_size() * HeapWordSize + |
|
1920 Klass::super_check_offset_offset_in_bytes()); |
|
1921 |
1917 |
1922 Register rsi_dst_klass = rsi; |
1918 Register rsi_dst_klass = rsi; |
1923 Register rdi_temp = rdi; |
1919 Register rdi_temp = rdi; |
1924 assert(rsi_dst_klass == src_pos, "expected alias w/ src_pos"); |
1920 assert(rsi_dst_klass == src_pos, "expected alias w/ src_pos"); |
1925 assert(rdi_temp == dst_pos, "expected alias w/ dst_pos"); |
1921 assert(rdi_temp == dst_pos, "expected alias w/ dst_pos"); |