< prev index next >

src/hotspot/cpu/aarch64/vtableStubs_aarch64.cpp

Print this page
rev 48518 : 8196136: AArch64: Correct register use in patch for JDK-8195685
Summary: itable stubs must not use java argument registers as scratch registers
Reviewed-by: duke


 128   // away with.  If you add code here, bump the code stub size
 129   // returned by pd_code_size_limit!
 130   const int code_length = VtableStub::pd_code_size_limit(false);
 131   VtableStub* s = new(code_length) VtableStub(false, itable_index);
 132   ResourceMark rm;
 133   CodeBuffer cb(s->entry_point(), code_length);
 134   MacroAssembler* masm = new MacroAssembler(&cb);
 135 
 136 #ifndef PRODUCT
 137   if (CountCompiledCalls) {
 138     __ lea(r10, ExternalAddress((address) SharedRuntime::nof_megamorphic_calls_addr()));
 139     __ incrementw(Address(r10));
 140   }
 141 #endif
 142 
 143   // Entry arguments:
 144   //  rscratch2: CompiledICHolder
 145   //  j_rarg0: Receiver
 146 
 147 
 148   // Most registers are in use; we'll use r0, rmethod, r10, r11
 149   const Register recv_klass_reg     = r10;
 150   const Register holder_klass_reg   = r0; // declaring interface klass (DECC)
 151   const Register resolved_klass_reg = rmethod; // resolved interface klass (REFC)
 152   const Register temp_reg           = r11;
 153   const Register icholder_reg       = rscratch2;
 154 
 155   Label L_no_such_interface;
 156 
 157   __ ldr(resolved_klass_reg, Address(icholder_reg, CompiledICHolder::holder_klass_offset()));
 158   __ ldr(holder_klass_reg,   Address(icholder_reg, CompiledICHolder::holder_metadata_offset()));
 159 
 160   // get receiver (need to skip return address on top of stack)
 161   assert(VtableStub::receiver_location() == j_rarg0->as_VMReg(), "receiver expected in j_rarg0");
 162   // get receiver klass (also an implicit null-check)
 163   address npe_addr = __ pc();
 164   __ load_klass(recv_klass_reg, j_rarg0);
 165 
 166   // Receiver subtype check against REFC.
 167   // Destroys recv_klass_reg value.
 168   __ lookup_interface_method(// inputs: rec. class, interface
 169                              recv_klass_reg, resolved_klass_reg, noreg,
 170                              // outputs:  scan temp. reg1, scan temp. reg2




 128   // away with.  If you add code here, bump the code stub size
 129   // returned by pd_code_size_limit!
 130   const int code_length = VtableStub::pd_code_size_limit(false);
 131   VtableStub* s = new(code_length) VtableStub(false, itable_index);
 132   ResourceMark rm;
 133   CodeBuffer cb(s->entry_point(), code_length);
 134   MacroAssembler* masm = new MacroAssembler(&cb);
 135 
 136 #ifndef PRODUCT
 137   if (CountCompiledCalls) {
 138     __ lea(r10, ExternalAddress((address) SharedRuntime::nof_megamorphic_calls_addr()));
 139     __ incrementw(Address(r10));
 140   }
 141 #endif
 142 
 143   // Entry arguments:
 144   //  rscratch2: CompiledICHolder
 145   //  j_rarg0: Receiver
 146 
 147 
 148   // Most registers are in use; we'll use r19, rmethod, r10, r11
 149   const Register recv_klass_reg     = r10;
 150   const Register holder_klass_reg   = r19; // declaring interface klass (DECC)
 151   const Register resolved_klass_reg = rmethod; // resolved interface klass (REFC)
 152   const Register temp_reg           = r11;
 153   const Register icholder_reg       = rscratch2;
 154 
 155   Label L_no_such_interface;
 156 
 157   __ ldr(resolved_klass_reg, Address(icholder_reg, CompiledICHolder::holder_klass_offset()));
 158   __ ldr(holder_klass_reg,   Address(icholder_reg, CompiledICHolder::holder_metadata_offset()));
 159 
 160   // get receiver (need to skip return address on top of stack)
 161   assert(VtableStub::receiver_location() == j_rarg0->as_VMReg(), "receiver expected in j_rarg0");
 162   // get receiver klass (also an implicit null-check)
 163   address npe_addr = __ pc();
 164   __ load_klass(recv_klass_reg, j_rarg0);
 165 
 166   // Receiver subtype check against REFC.
 167   // Destroys recv_klass_reg value.
 168   __ lookup_interface_method(// inputs: rec. class, interface
 169                              recv_klass_reg, resolved_klass_reg, noreg,
 170                              // outputs:  scan temp. reg1, scan temp. reg2


< prev index next >