< prev index next >

src/hotspot/cpu/aarch64/macroAssembler_aarch64.cpp

Print this page




 723   if (oop_result->is_valid()) {
 724     get_vm_result(oop_result, java_thread);
 725   }
 726 }
 727 
 728 void MacroAssembler::call_VM_helper(Register oop_result, address entry_point, int number_of_arguments, bool check_exceptions) {
 729   call_VM_base(oop_result, noreg, noreg, entry_point, number_of_arguments, check_exceptions);
 730 }
 731 
 732 // Maybe emit a call via a trampoline.  If the code cache is small
 733 // trampolines won't be emitted.
 734 
 735 address MacroAssembler::trampoline_call(Address entry, CodeBuffer *cbuf) {
 736   assert(JavaThread::current()->is_Compiler_thread(), "just checking");
 737   assert(entry.rspec().type() == relocInfo::runtime_call_type
 738          || entry.rspec().type() == relocInfo::opt_virtual_call_type
 739          || entry.rspec().type() == relocInfo::static_call_type
 740          || entry.rspec().type() == relocInfo::virtual_call_type, "wrong reloc type");
 741 
 742   unsigned int start_offset = offset();
 743   if (far_branches() && !Compile::current()->in_scratch_emit_size()) {
 744     address stub = emit_trampoline_stub(start_offset, entry.target());
 745     if (stub == NULL) {
 746       return NULL; // CodeCache is full
 747     }
 748   }
 749 
 750   if (cbuf) cbuf->set_insts_mark();
 751   relocate(entry.rspec());
 752   if (!far_branches()) {
 753     bl(entry.target());
 754   } else {
 755     bl(pc());


 756   }
 757   // just need to return a non-null address
 758   return pc();
 759 }
 760 
 761 
 762 // Emit a trampoline stub for a call to a target which is too far away.
 763 //
 764 // code sequences:
 765 //
 766 // call-site:
 767 //   branch-and-link to <destination> or <trampoline stub>
 768 //
 769 // Related trampoline stub for this call site in the stub section:
 770 //   load the call target from the constant pool
 771 //   branch (LR still points to the call site above)
 772 
 773 address MacroAssembler::emit_trampoline_stub(int insts_call_instruction_offset,
 774                                              address dest) {
 775   address stub = start_a_stub(Compile::MAX_stubs_size/2);
 776   if (stub == NULL) {
 777     return NULL;  // CodeBuffer::expand failed


1033   }
1034 }
1035 
1036 // virtual method calling
1037 void MacroAssembler::lookup_virtual_method(Register recv_klass,
1038                                            RegisterOrConstant vtable_index,
1039                                            Register method_result) {
1040   const int base = in_bytes(Klass::vtable_start_offset());
1041   assert(vtableEntry::size() * wordSize == 8,
1042          "adjust the scaling in the code below");
1043   int vtable_offset_in_bytes = base + vtableEntry::method_offset_in_bytes();
1044 
1045   if (vtable_index.is_register()) {
1046     lea(method_result, Address(recv_klass,
1047                                vtable_index.as_register(),
1048                                Address::lsl(LogBytesPerWord)));
1049     ldr(method_result, Address(method_result, vtable_offset_in_bytes));
1050   } else {
1051     vtable_offset_in_bytes += vtable_index.as_constant() * wordSize;
1052     ldr(method_result,
1053         form_address(rscratch1, recv_klass, vtable_offset_in_bytes));
1054   }
1055 }
1056 
1057 void MacroAssembler::check_klass_subtype(Register sub_klass,
1058                            Register super_klass,
1059                            Register temp_reg,
1060                            Label& L_success) {
1061   Label L_failure;
1062   check_klass_subtype_fast_path(sub_klass, super_klass, temp_reg,        &L_success, &L_failure, NULL);
1063   check_klass_subtype_slow_path(sub_klass, super_klass, temp_reg, noreg, &L_success, NULL);
1064   bind(L_failure);
1065 }
1066 
1067 
1068 void MacroAssembler::check_klass_subtype_fast_path(Register sub_klass,
1069                                                    Register super_klass,
1070                                                    Register temp_reg,
1071                                                    Label* L_success,
1072                                                    Label* L_failure,
1073                                                    Label* L_slow_path,




 723   if (oop_result->is_valid()) {
 724     get_vm_result(oop_result, java_thread);
 725   }
 726 }
 727 
 728 void MacroAssembler::call_VM_helper(Register oop_result, address entry_point, int number_of_arguments, bool check_exceptions) {
 729   call_VM_base(oop_result, noreg, noreg, entry_point, number_of_arguments, check_exceptions);
 730 }
 731 
 732 // Maybe emit a call via a trampoline.  If the code cache is small
 733 // trampolines won't be emitted.
 734 
 735 address MacroAssembler::trampoline_call(Address entry, CodeBuffer *cbuf) {
 736   assert(JavaThread::current()->is_Compiler_thread(), "just checking");
 737   assert(entry.rspec().type() == relocInfo::runtime_call_type
 738          || entry.rspec().type() == relocInfo::opt_virtual_call_type
 739          || entry.rspec().type() == relocInfo::static_call_type
 740          || entry.rspec().type() == relocInfo::virtual_call_type, "wrong reloc type");
 741 
 742   unsigned int start_offset = offset();
 743   if (UseAOT || (far_branches() && !Compile::current()->in_scratch_emit_size())) {
 744     address stub = emit_trampoline_stub(start_offset, entry.target());
 745     if (stub == NULL) {
 746       return NULL; // CodeCache is full
 747     }
 748   }
 749 
 750   if (cbuf) cbuf->set_insts_mark();
 751   relocate(entry.rspec());
 752   if (UseAOT || far_branches()) {


 753     bl(pc());
 754   } else {
 755     bl(entry.target());
 756   }
 757 
 758   return pc();
 759 }
 760 
 761 
 762 // Emit a trampoline stub for a call to a target which is too far away.
 763 //
 764 // code sequences:
 765 //
 766 // call-site:
 767 //   branch-and-link to <destination> or <trampoline stub>
 768 //
 769 // Related trampoline stub for this call site in the stub section:
 770 //   load the call target from the constant pool
 771 //   branch (LR still points to the call site above)
 772 
 773 address MacroAssembler::emit_trampoline_stub(int insts_call_instruction_offset,
 774                                              address dest) {
 775   address stub = start_a_stub(Compile::MAX_stubs_size/2);
 776   if (stub == NULL) {
 777     return NULL;  // CodeBuffer::expand failed


1033   }
1034 }
1035 
1036 // virtual method calling
1037 void MacroAssembler::lookup_virtual_method(Register recv_klass,
1038                                            RegisterOrConstant vtable_index,
1039                                            Register method_result) {
1040   const int base = in_bytes(Klass::vtable_start_offset());
1041   assert(vtableEntry::size() * wordSize == 8,
1042          "adjust the scaling in the code below");
1043   int vtable_offset_in_bytes = base + vtableEntry::method_offset_in_bytes();
1044 
1045   if (vtable_index.is_register()) {
1046     lea(method_result, Address(recv_klass,
1047                                vtable_index.as_register(),
1048                                Address::lsl(LogBytesPerWord)));
1049     ldr(method_result, Address(method_result, vtable_offset_in_bytes));
1050   } else {
1051     vtable_offset_in_bytes += vtable_index.as_constant() * wordSize;
1052     ldr(method_result,
1053         form_address(rscratch1, recv_klass, vtable_offset_in_bytes, 0));
1054   }
1055 }
1056 
1057 void MacroAssembler::check_klass_subtype(Register sub_klass,
1058                            Register super_klass,
1059                            Register temp_reg,
1060                            Label& L_success) {
1061   Label L_failure;
1062   check_klass_subtype_fast_path(sub_klass, super_klass, temp_reg,        &L_success, &L_failure, NULL);
1063   check_klass_subtype_slow_path(sub_klass, super_klass, temp_reg, noreg, &L_success, NULL);
1064   bind(L_failure);
1065 }
1066 
1067 
1068 void MacroAssembler::check_klass_subtype_fast_path(Register sub_klass,
1069                                                    Register super_klass,
1070                                                    Register temp_reg,
1071                                                    Label* L_success,
1072                                                    Label* L_failure,
1073                                                    Label* L_slow_path,


< prev index next >