Mercurial > hg > truffle
comparison src/cpu/x86/vm/interp_masm_x86_32.cpp @ 647:bd441136a5ce
Merge
author | kvn |
---|---|
date | Thu, 19 Mar 2009 09:13:24 -0700 |
parents | 7bb995fbd3c0 c517646eef23 |
children | e5b0439ef4ae |
comparison
equal
deleted
inserted
replaced
640:ba50942c8138 | 647:bd441136a5ce |
---|---|
217 // Generate a subtype check: branch to ok_is_subtype if sub_klass is | 217 // Generate a subtype check: branch to ok_is_subtype if sub_klass is |
218 // a subtype of super_klass. EAX holds the super_klass. Blows ECX. | 218 // a subtype of super_klass. EAX holds the super_klass. Blows ECX. |
219 // Resets EDI to locals. Register sub_klass cannot be any of the above. | 219 // Resets EDI to locals. Register sub_klass cannot be any of the above. |
220 void InterpreterMacroAssembler::gen_subtype_check( Register Rsub_klass, Label &ok_is_subtype ) { | 220 void InterpreterMacroAssembler::gen_subtype_check( Register Rsub_klass, Label &ok_is_subtype ) { |
221 assert( Rsub_klass != rax, "rax, holds superklass" ); | 221 assert( Rsub_klass != rax, "rax, holds superklass" ); |
222 assert( Rsub_klass != rcx, "rcx holds 2ndary super array length" ); | 222 assert( Rsub_klass != rcx, "used as a temp" ); |
223 assert( Rsub_klass != rdi, "rdi holds 2ndary super array scan ptr" ); | 223 assert( Rsub_klass != rdi, "used as a temp, restored from locals" ); |
224 Label not_subtype, loop; | |
225 | 224 |
226 // Profile the not-null value's klass. | 225 // Profile the not-null value's klass. |
227 profile_typecheck(rcx, Rsub_klass, rdi); // blows rcx, rdi | 226 profile_typecheck(rcx, Rsub_klass, rdi); // blows rcx, reloads rdi |
228 | 227 |
229 // Load the super-klass's check offset into ECX | 228 // Do the check. |
230 movl( rcx, Address(rax, sizeof(oopDesc) + Klass::super_check_offset_offset_in_bytes() ) ); | 229 check_klass_subtype(Rsub_klass, rax, rcx, ok_is_subtype); // blows rcx |
231 // Load from the sub-klass's super-class display list, or a 1-word cache of | 230 |
232 // the secondary superclass list, or a failing value with a sentinel offset | 231 // Profile the failure of the check. |
233 // if the super-klass is an interface or exceptionally deep in the Java | |
234 // hierarchy and we have to scan the secondary superclass list the hard way. | |
235 // See if we get an immediate positive hit | |
236 cmpptr( rax, Address(Rsub_klass,rcx,Address::times_1) ); | |
237 jcc( Assembler::equal,ok_is_subtype ); | |
238 | |
239 // Check for immediate negative hit | |
240 cmpl( rcx, sizeof(oopDesc) + Klass::secondary_super_cache_offset_in_bytes() ); | |
241 jcc( Assembler::notEqual, not_subtype ); | |
242 // Check for self | |
243 cmpptr( Rsub_klass, rax ); | |
244 jcc( Assembler::equal, ok_is_subtype ); | |
245 | |
246 // Now do a linear scan of the secondary super-klass chain. | |
247 movptr( rdi, Address(Rsub_klass, sizeof(oopDesc) + Klass::secondary_supers_offset_in_bytes()) ); | |
248 // EDI holds the objArrayOop of secondary supers. | |
249 movl( rcx, Address(rdi, arrayOopDesc::length_offset_in_bytes()));// Load the array length | |
250 // Skip to start of data; also clear Z flag incase ECX is zero | |
251 addptr( rdi, arrayOopDesc::base_offset_in_bytes(T_OBJECT) ); | |
252 // Scan ECX words at [EDI] for occurance of EAX | |
253 // Set NZ/Z based on last compare | |
254 repne_scan(); | |
255 restore_locals(); // Restore EDI; Must not blow flags | |
256 // Not equal? | |
257 jcc( Assembler::notEqual, not_subtype ); | |
258 // Must be equal but missed in cache. Update cache. | |
259 movptr( Address(Rsub_klass, sizeof(oopDesc) + Klass::secondary_super_cache_offset_in_bytes()), rax ); | |
260 jmp( ok_is_subtype ); | |
261 | |
262 bind(not_subtype); | |
263 profile_typecheck_failed(rcx); // blows rcx | 232 profile_typecheck_failed(rcx); // blows rcx |
264 } | 233 } |
265 | 234 |
266 void InterpreterMacroAssembler::f2ieee() { | 235 void InterpreterMacroAssembler::f2ieee() { |
267 if (IEEEPrecision) { | 236 if (IEEEPrecision) { |