src/hotspot/cpu/aarch64/vtableStubs_aarch64.cpp
changeset 48707 a5736067e82a
parent 48701 48ce4b11bc17
child 49368 2ed1c37df3a5
equal deleted inserted replaced
48706:69d1a1590485 48707:a5736067e82a
    61   CodeBuffer cb(s->entry_point(), aarch64_code_length);
    61   CodeBuffer cb(s->entry_point(), aarch64_code_length);
    62   MacroAssembler* masm = new MacroAssembler(&cb);
    62   MacroAssembler* masm = new MacroAssembler(&cb);
    63 
    63 
    64 #ifndef PRODUCT
    64 #ifndef PRODUCT
    65   if (CountCompiledCalls) {
    65   if (CountCompiledCalls) {
    66     __ lea(r19, ExternalAddress((address) SharedRuntime::nof_megamorphic_calls_addr()));
    66     __ lea(r16, ExternalAddress((address) SharedRuntime::nof_megamorphic_calls_addr()));
    67     __ incrementw(Address(r19));
    67     __ incrementw(Address(r16));
    68   }
    68   }
    69 #endif
    69 #endif
    70 
    70 
    71   // get receiver (need to skip return address on top of stack)
    71   // get receiver (need to skip return address on top of stack)
    72   assert(VtableStub::receiver_location() == j_rarg0->as_VMReg(), "receiver expected in j_rarg0");
    72   assert(VtableStub::receiver_location() == j_rarg0->as_VMReg(), "receiver expected in j_rarg0");
    73 
    73 
    74   // get receiver klass
    74   // get receiver klass
    75   address npe_addr = __ pc();
    75   address npe_addr = __ pc();
    76   __ load_klass(r19, j_rarg0);
    76   __ load_klass(r16, j_rarg0);
    77 
    77 
    78 #ifndef PRODUCT
    78 #ifndef PRODUCT
    79   if (DebugVtables) {
    79   if (DebugVtables) {
    80     Label L;
    80     Label L;
    81     // check offset vs vtable length
    81     // check offset vs vtable length
    82     __ ldrw(rscratch1, Address(r19, Klass::vtable_length_offset()));
    82     __ ldrw(rscratch1, Address(r16, Klass::vtable_length_offset()));
    83     __ cmpw(rscratch1, vtable_index * vtableEntry::size());
    83     __ cmpw(rscratch1, vtable_index * vtableEntry::size());
    84     __ br(Assembler::GT, L);
    84     __ br(Assembler::GT, L);
    85     __ enter();
    85     __ enter();
    86     __ mov(r2, vtable_index);
    86     __ mov(r2, vtable_index);
    87     __ call_VM(noreg,
    87     __ call_VM(noreg,
    89     __ leave();
    89     __ leave();
    90     __ bind(L);
    90     __ bind(L);
    91   }
    91   }
    92 #endif // PRODUCT
    92 #endif // PRODUCT
    93 
    93 
    94   __ lookup_virtual_method(r19, vtable_index, rmethod);
    94   __ lookup_virtual_method(r16, vtable_index, rmethod);
    95 
    95 
    96   if (DebugVtables) {
    96   if (DebugVtables) {
    97     Label L;
    97     Label L;
    98     __ cbz(rmethod, L);
    98     __ cbz(rmethod, L);
    99     __ ldr(rscratch1, Address(rmethod, Method::from_compiled_offset()));
    99     __ ldr(rscratch1, Address(rmethod, Method::from_compiled_offset()));
   143   // Entry arguments:
   143   // Entry arguments:
   144   //  rscratch2: CompiledICHolder
   144   //  rscratch2: CompiledICHolder
   145   //  j_rarg0: Receiver
   145   //  j_rarg0: Receiver
   146 
   146 
   147 
   147 
   148   // Most registers are in use; we'll use r0, rmethod, r10, r11
   148   // Most registers are in use; we'll use r16, rmethod, r10, r11
   149   const Register recv_klass_reg     = r10;
   149   const Register recv_klass_reg     = r10;
   150   const Register holder_klass_reg   = r0; // declaring interface klass (DECC)
   150   const Register holder_klass_reg   = r16; // declaring interface klass (DECC)
   151   const Register resolved_klass_reg = rmethod; // resolved interface klass (REFC)
   151   const Register resolved_klass_reg = rmethod; // resolved interface klass (REFC)
   152   const Register temp_reg           = r11;
   152   const Register temp_reg           = r11;
   153   const Register icholder_reg       = rscratch2;
   153   const Register icholder_reg       = rscratch2;
   154 
   154 
   155   Label L_no_such_interface;
   155   Label L_no_such_interface;