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 |