893 Register method_result, 894 Register scan_temp, 895 Label& L_no_such_interface) { 896 assert_different_registers(recv_klass, intf_klass, method_result, scan_temp); 897 assert(itable_index.is_constant() || itable_index.as_register() == method_result, 898 "caller must use same register for non-constant itable index as for method"); 899 900 // Compute start of first itableOffsetEntry (which is at the end of the vtable) 901 int vtable_base = InstanceKlass::vtable_start_offset() * wordSize; 902 int itentry_off = itableMethodEntry::method_offset_in_bytes(); 903 int scan_step = itableOffsetEntry::size() * wordSize; 904 int vte_size = vtableEntry::size() * wordSize; 905 assert(vte_size == wordSize, "else adjust times_vte_scale"); 906 907 ldrw(scan_temp, Address(recv_klass, InstanceKlass::vtable_length_offset() * wordSize)); 908 909 // %%% Could store the aligned, prescaled offset in the klassoop. 910 // lea(scan_temp, Address(recv_klass, scan_temp, times_vte_scale, vtable_base)); 911 lea(scan_temp, Address(recv_klass, scan_temp, Address::lsl(3))); 912 add(scan_temp, scan_temp, vtable_base); 913 if (HeapWordsPerLong > 1) { 914 // Round up to align_object_offset boundary 915 // see code for instanceKlass::start_of_itable! 916 round_to(scan_temp, BytesPerLong); 917 } 918 919 // Adjust recv_klass by scaled itable_index, so we can free itable_index. 920 assert(itableMethodEntry::size() * wordSize == wordSize, "adjust the scaling in the code below"); 921 // lea(recv_klass, Address(recv_klass, itable_index, Address::times_ptr, itentry_off)); 922 lea(recv_klass, Address(recv_klass, itable_index, Address::lsl(3))); 923 if (itentry_off) 924 add(recv_klass, recv_klass, itentry_off); 925 926 // for (scan = klass->itable(); scan->interface() != NULL; scan += scan_step) { 927 // if (scan->interface() == intf) { 928 // result = (klass + scan->offset() + itable_index); 929 // } 930 // } 931 Label search, found_method; 932 933 for (int peel = 1; peel >= 0; peel--) { 934 ldr(method_result, Address(scan_temp, itableOffsetEntry::interface_offset_in_bytes())); 935 cmp(intf_klass, method_result); 936 937 if (peel) { | 893 Register method_result, 894 Register scan_temp, 895 Label& L_no_such_interface) { 896 assert_different_registers(recv_klass, intf_klass, method_result, scan_temp); 897 assert(itable_index.is_constant() || itable_index.as_register() == method_result, 898 "caller must use same register for non-constant itable index as for method"); 899 900 // Compute start of first itableOffsetEntry (which is at the end of the vtable) 901 int vtable_base = InstanceKlass::vtable_start_offset() * wordSize; 902 int itentry_off = itableMethodEntry::method_offset_in_bytes(); 903 int scan_step = itableOffsetEntry::size() * wordSize; 904 int vte_size = vtableEntry::size() * wordSize; 905 assert(vte_size == wordSize, "else adjust times_vte_scale"); 906 907 ldrw(scan_temp, Address(recv_klass, InstanceKlass::vtable_length_offset() * wordSize)); 908 909 // %%% Could store the aligned, prescaled offset in the klassoop. 910 // lea(scan_temp, Address(recv_klass, scan_temp, times_vte_scale, vtable_base)); 911 lea(scan_temp, Address(recv_klass, scan_temp, Address::lsl(3))); 912 add(scan_temp, scan_temp, vtable_base); 913 914 // Adjust recv_klass by scaled itable_index, so we can free itable_index. 915 assert(itableMethodEntry::size() * wordSize == wordSize, "adjust the scaling in the code below"); 916 // lea(recv_klass, Address(recv_klass, itable_index, Address::times_ptr, itentry_off)); 917 lea(recv_klass, Address(recv_klass, itable_index, Address::lsl(3))); 918 if (itentry_off) 919 add(recv_klass, recv_klass, itentry_off); 920 921 // for (scan = klass->itable(); scan->interface() != NULL; scan += scan_step) { 922 // if (scan->interface() == intf) { 923 // result = (klass + scan->offset() + itable_index); 924 // } 925 // } 926 Label search, found_method; 927 928 for (int peel = 1; peel >= 0; peel--) { 929 ldr(method_result, Address(scan_temp, itableOffsetEntry::interface_offset_in_bytes())); 930 cmp(intf_klass, method_result); 931 932 if (peel) { |