hotspot/src/cpu/sparc/vm/vtableStubs_sparc.cpp
changeset 360 21d113ecbf6a
parent 189 4248c8e21063
child 670 ddf3e9583f2f
equal deleted inserted replaced
357:f4edb0d9f109 360:21d113ecbf6a
    58 
    58 
    59   assert(VtableStub::receiver_location() == O0->as_VMReg(), "receiver expected in O0");
    59   assert(VtableStub::receiver_location() == O0->as_VMReg(), "receiver expected in O0");
    60 
    60 
    61   // get receiver klass
    61   // get receiver klass
    62   address npe_addr = __ pc();
    62   address npe_addr = __ pc();
    63   __ ld_ptr(O0, oopDesc::klass_offset_in_bytes(), G3_scratch);
    63   __ load_klass(O0, G3_scratch);
    64 
    64 
    65   // set methodOop (in case of interpreted method), and destination address
    65   // set methodOop (in case of interpreted method), and destination address
    66   int entry_offset = instanceKlass::vtable_start_offset() + vtable_index*vtableEntry::size();
    66   int entry_offset = instanceKlass::vtable_start_offset() + vtable_index*vtableEntry::size();
    67 #ifndef PRODUCT
    67 #ifndef PRODUCT
    68   if (DebugVtables) {
    68   if (DebugVtables) {
   129   //  O0:           Receiver
   129   //  O0:           Receiver
   130   assert(VtableStub::receiver_location() == O0->as_VMReg(), "receiver expected in O0");
   130   assert(VtableStub::receiver_location() == O0->as_VMReg(), "receiver expected in O0");
   131 
   131 
   132   // get receiver klass (also an implicit null-check)
   132   // get receiver klass (also an implicit null-check)
   133   address npe_addr = __ pc();
   133   address npe_addr = __ pc();
   134   __ ld_ptr(O0, oopDesc::klass_offset_in_bytes(), G3_klassOop);
   134   __ load_klass(O0, G3_klassOop);
   135   __ verify_oop(G3_klassOop);
   135   __ verify_oop(G3_klassOop);
   136 
   136 
   137   // Push a new window to get some temp registers.  This chops the head of all
   137   // Push a new window to get some temp registers.  This chops the head of all
   138   // my 64-bit %o registers in the LION build, but this is OK because no longs
   138   // my 64-bit %o registers in the LION build, but this is OK because no longs
   139   // are passed in the %o registers.  Instead, longs are passed in G1 and G4
   139   // are passed in the %o registers.  Instead, longs are passed in G1 and G4
   235 int VtableStub::pd_code_size_limit(bool is_vtable_stub) {
   235 int VtableStub::pd_code_size_limit(bool is_vtable_stub) {
   236   if (TraceJumps || DebugVtables || CountCompiledCalls || VerifyOops) return 1000;
   236   if (TraceJumps || DebugVtables || CountCompiledCalls || VerifyOops) return 1000;
   237   else {
   237   else {
   238     const int slop = 2*BytesPerInstWord; // sethi;add  (needed for long offsets)
   238     const int slop = 2*BytesPerInstWord; // sethi;add  (needed for long offsets)
   239     if (is_vtable_stub) {
   239     if (is_vtable_stub) {
   240       const int basic = 5*BytesPerInstWord; // ld;ld;ld,jmp,nop
   240       // ld;ld;ld,jmp,nop
       
   241       const int basic = 5*BytesPerInstWord +
       
   242                         // shift;add for load_klass
       
   243                         (UseCompressedOops ? 2*BytesPerInstWord : 0);
   241       return basic + slop;
   244       return basic + slop;
   242     } else {
   245     } else {
   243       // save, ld, ld, sll, and, add, add, ld, cmp, br, add, ld, add, ld, ld, jmp, restore, sethi, jmpl, restore
   246       // save, ld, ld, sll, and, add, add, ld, cmp, br, add, ld, add, ld, ld, jmp, restore, sethi, jmpl, restore
   244       const int basic = (20 LP64_ONLY(+ 6)) * BytesPerInstWord;
   247       const int basic = (20 LP64_ONLY(+ 6)) * BytesPerInstWord +
       
   248                         // shift;add for load_klass
       
   249                         (UseCompressedOops ? 2*BytesPerInstWord : 0);
   245       return (basic + slop);
   250       return (basic + slop);
   246     }
   251     }
   247   }
   252   }
   248 }
   253 }
   249 
   254