changeset 360 | 21d113ecbf6a |
parent 189 | 4248c8e21063 |
child 670 | ddf3e9583f2f |
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 |