hotspot/src/cpu/x86/vm/stubGenerator_x86_32.cpp
changeset 13952 e3cf184080bc
parent 13728 882756847a04
child 14132 3c1437abcefd
equal deleted inserted replaced
13918:b01a48301e67 13952:e3cf184080bc
  1799 #endif
  1799 #endif
  1800 
  1800 
  1801     assert_different_registers(src, src_pos, dst, dst_pos, rcx_lh);
  1801     assert_different_registers(src, src_pos, dst, dst_pos, rcx_lh);
  1802     arraycopy_range_checks(src, src_pos, dst, dst_pos, LENGTH, L_failed);
  1802     arraycopy_range_checks(src, src_pos, dst, dst_pos, LENGTH, L_failed);
  1803 
  1803 
  1804     // typeArrayKlass
  1804     // TypeArrayKlass
  1805     //
  1805     //
  1806     // src_addr = (src + array_header_in_bytes()) + (src_pos << log2elemsize);
  1806     // src_addr = (src + array_header_in_bytes()) + (src_pos << log2elemsize);
  1807     // dst_addr = (dst + array_header_in_bytes()) + (dst_pos << log2elemsize);
  1807     // dst_addr = (dst + array_header_in_bytes()) + (dst_pos << log2elemsize);
  1808     //
  1808     //
  1809     const Register rsi_offset = rsi; // array offset
  1809     const Register rsi_offset = rsi; // array offset
  1862     __ pop(rdi);
  1862     __ pop(rdi);
  1863     __ pop(rsi);
  1863     __ pop(rsi);
  1864     __ leave(); // required for proper stackwalking of RuntimeStub frame
  1864     __ leave(); // required for proper stackwalking of RuntimeStub frame
  1865     __ ret(0);
  1865     __ ret(0);
  1866 
  1866 
  1867     // objArrayKlass
  1867     // ObjArrayKlass
  1868   __ BIND(L_objArray);
  1868   __ BIND(L_objArray);
  1869     // live at this point:  rcx_src_klass, src[_pos], dst[_pos]
  1869     // live at this point:  rcx_src_klass, src[_pos], dst[_pos]
  1870 
  1870 
  1871     Label L_plain_copy, L_checkcast_copy;
  1871     Label L_plain_copy, L_checkcast_copy;
  1872     //  test array classes for subtyping
  1872     //  test array classes for subtyping
  1892 
  1892 
  1893   __ BIND(L_checkcast_copy);
  1893   __ BIND(L_checkcast_copy);
  1894     // live at this point:  rcx_src_klass, dst[_pos], src[_pos]
  1894     // live at this point:  rcx_src_klass, dst[_pos], src[_pos]
  1895     {
  1895     {
  1896       // Handy offsets:
  1896       // Handy offsets:
  1897       int  ek_offset = in_bytes(objArrayKlass::element_klass_offset());
  1897       int  ek_offset = in_bytes(ObjArrayKlass::element_klass_offset());
  1898       int sco_offset = in_bytes(Klass::super_check_offset_offset());
  1898       int sco_offset = in_bytes(Klass::super_check_offset_offset());
  1899 
  1899 
  1900       Register rsi_dst_klass = rsi;
  1900       Register rsi_dst_klass = rsi;
  1901       Register rdi_temp      = rdi;
  1901       Register rdi_temp      = rdi;
  1902       assert(rsi_dst_klass == src_pos, "expected alias w/ src_pos");
  1902       assert(rsi_dst_klass == src_pos, "expected alias w/ src_pos");