hotspot/src/cpu/x86/vm/stubGenerator_x86_32.cpp
changeset 11439 7af64224c70b
parent 11411 16b151e1e088
parent 11430 718fc06da49a
child 12739 09f26b73ae66
equal deleted inserted replaced
11423:cb215b69197c 11439:7af64224c70b
  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");