< prev index next >

src/hotspot/cpu/x86/interp_masm_x86.cpp

Print this page




 507 
 508   get_constant_pool(result);
 509   // load pointer for resolved_references[] objArray
 510   movptr(result, Address(result, ConstantPool::cache_offset_in_bytes()));
 511   movptr(result, Address(result, ConstantPoolCache::resolved_references_offset_in_bytes()));
 512   resolve_oop_handle(result, tmp);
 513   load_heap_oop(result, Address(result, index,
 514                                 UseCompressedOops ? Address::times_4 : Address::times_ptr,
 515                                 arrayOopDesc::base_offset_in_bytes(T_OBJECT)), tmp);
 516 }
 517 
 518 // load cpool->resolved_klass_at(index)
 519 void InterpreterMacroAssembler::load_resolved_klass_at_index(Register cpool,
 520                                            Register index, Register klass) {
 521   movw(index, Address(cpool, index, Address::times_ptr, sizeof(ConstantPool)));
 522   Register resolved_klasses = cpool;
 523   movptr(resolved_klasses, Address(cpool, ConstantPool::resolved_klasses_offset_in_bytes()));
 524   movptr(klass, Address(resolved_klasses, index, Address::times_ptr, Array<Klass*>::base_offset_in_bytes()));
 525 }
 526 













 527 // Generate a subtype check: branch to ok_is_subtype if sub_klass is a
 528 // subtype of super_klass.
 529 //
 530 // Args:
 531 //      rax: superklass
 532 //      Rsub_klass: subklass
 533 //
 534 // Kills:
 535 //      rcx, rdi
 536 void InterpreterMacroAssembler::gen_subtype_check(Register Rsub_klass,
 537                                                   Label& ok_is_subtype) {
 538   assert(Rsub_klass != rax, "rax holds superklass");
 539   LP64_ONLY(assert(Rsub_klass != r14, "r14 holds locals");)
 540   LP64_ONLY(assert(Rsub_klass != r13, "r13 holds bcp");)
 541   assert(Rsub_klass != rcx, "rcx holds 2ndary super array length");
 542   assert(Rsub_klass != rdi, "rdi holds 2ndary super array scan ptr");
 543 
 544   // Profile the not-null value's klass.
 545   profile_typecheck(rcx, Rsub_klass, rdi); // blows rcx, reloads rdi
 546 




 507 
 508   get_constant_pool(result);
 509   // load pointer for resolved_references[] objArray
 510   movptr(result, Address(result, ConstantPool::cache_offset_in_bytes()));
 511   movptr(result, Address(result, ConstantPoolCache::resolved_references_offset_in_bytes()));
 512   resolve_oop_handle(result, tmp);
 513   load_heap_oop(result, Address(result, index,
 514                                 UseCompressedOops ? Address::times_4 : Address::times_ptr,
 515                                 arrayOopDesc::base_offset_in_bytes(T_OBJECT)), tmp);
 516 }
 517 
 518 // load cpool->resolved_klass_at(index)
 519 void InterpreterMacroAssembler::load_resolved_klass_at_index(Register cpool,
 520                                            Register index, Register klass) {
 521   movw(index, Address(cpool, index, Address::times_ptr, sizeof(ConstantPool)));
 522   Register resolved_klasses = cpool;
 523   movptr(resolved_klasses, Address(cpool, ConstantPool::resolved_klasses_offset_in_bytes()));
 524   movptr(klass, Address(resolved_klasses, index, Address::times_ptr, Array<Klass*>::base_offset_in_bytes()));
 525 }
 526 
 527 void InterpreterMacroAssembler::load_resolved_method_at_index(int byte_no,
 528                                                               Register cache,
 529                                                               Register index,
 530                                                               Register method) {
 531   const int method_offset = in_bytes(
 532     ConstantPoolCache::base_offset() +
 533       ((byte_no == TemplateTable::f2_byte)
 534        ? ConstantPoolCacheEntry::f2_offset()
 535        : ConstantPoolCacheEntry::f1_offset()));
 536 
 537   movptr(method, Address(cache, index, Address::times_ptr, method_offset)); // get f1 Method*
 538 }
 539 
 540 // Generate a subtype check: branch to ok_is_subtype if sub_klass is a
 541 // subtype of super_klass.
 542 //
 543 // Args:
 544 //      rax: superklass
 545 //      Rsub_klass: subklass
 546 //
 547 // Kills:
 548 //      rcx, rdi
 549 void InterpreterMacroAssembler::gen_subtype_check(Register Rsub_klass,
 550                                                   Label& ok_is_subtype) {
 551   assert(Rsub_klass != rax, "rax holds superklass");
 552   LP64_ONLY(assert(Rsub_klass != r14, "r14 holds locals");)
 553   LP64_ONLY(assert(Rsub_klass != r13, "r13 holds bcp");)
 554   assert(Rsub_klass != rcx, "rcx holds 2ndary super array length");
 555   assert(Rsub_klass != rdi, "rdi holds 2ndary super array scan ptr");
 556 
 557   // Profile the not-null value's klass.
 558   profile_typecheck(rcx, Rsub_klass, rdi); // blows rcx, reloads rdi
 559 


< prev index next >