src/cpu/aarch64/vm/macroAssembler_aarch64.cpp

Print this page




 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) {