< prev index next >

src/cpu/sparc/vm/interp_masm_sparc.cpp

Print this page




 713               // skip past the header
 714   add(tmp, in_bytes(ConstantPoolCache::base_offset()), tmp);
 715               // construct pointer to cache entry
 716   add(LcpoolCache, tmp, cache);
 717 }
 718 
 719 
 720 // Load object from cpool->resolved_references(index)
 721 void InterpreterMacroAssembler::load_resolved_reference_at_index(
 722                                            Register result, Register index) {
 723   assert_different_registers(result, index);
 724   assert_not_delayed();
 725   // convert from field index to resolved_references() index and from
 726   // word index to byte offset. Since this is a java object, it can be compressed
 727   Register tmp = index;  // reuse
 728   sll(index, LogBytesPerHeapOop, tmp);
 729   get_constant_pool(result);
 730   // load pointer for resolved_references[] objArray
 731   ld_ptr(result, ConstantPool::cache_offset_in_bytes(), result);
 732   ld_ptr(result, ConstantPoolCache::resolved_references_offset_in_bytes(), result);
 733   // JNIHandles::resolve(result)
 734   ld_ptr(result, 0, result);
 735   // Add in the index
 736   add(result, tmp, result);
 737   load_heap_oop(result, arrayOopDesc::base_offset_in_bytes(T_OBJECT), result);
 738 }
 739 
 740 
 741 // load cpool->resolved_klass_at(index)
 742 void InterpreterMacroAssembler::load_resolved_klass_at_offset(Register Rcpool,
 743                                            Register Roffset, Register Rklass) {
 744   // int value = *this_cp->int_at_addr(which);
 745   // int resolved_klass_index = extract_low_short_from_int(value);
 746   //
 747   // Because SPARC is big-endian, the low_short is at (cpool->int_at_addr(which) + 2 bytes)
 748   add(Roffset, Rcpool, Roffset);
 749   lduh(Roffset, sizeof(ConstantPool) + 2, Roffset);  // Roffset = resolved_klass_index
 750 
 751   Register Rresolved_klasses = Rklass;
 752   ld_ptr(Rcpool, ConstantPool::resolved_klasses_offset_in_bytes(), Rresolved_klasses);
 753   sll(Roffset, LogBytesPerWord, Roffset);
 754   add(Roffset, Array<Klass*>::base_offset_in_bytes(), Roffset);




 713               // skip past the header
 714   add(tmp, in_bytes(ConstantPoolCache::base_offset()), tmp);
 715               // construct pointer to cache entry
 716   add(LcpoolCache, tmp, cache);
 717 }
 718 
 719 
 720 // Load object from cpool->resolved_references(index)
 721 void InterpreterMacroAssembler::load_resolved_reference_at_index(
 722                                            Register result, Register index) {
 723   assert_different_registers(result, index);
 724   assert_not_delayed();
 725   // convert from field index to resolved_references() index and from
 726   // word index to byte offset. Since this is a java object, it can be compressed
 727   Register tmp = index;  // reuse
 728   sll(index, LogBytesPerHeapOop, tmp);
 729   get_constant_pool(result);
 730   // load pointer for resolved_references[] objArray
 731   ld_ptr(result, ConstantPool::cache_offset_in_bytes(), result);
 732   ld_ptr(result, ConstantPoolCache::resolved_references_offset_in_bytes(), result);
 733   resolve_oop_handle(result);

 734   // Add in the index
 735   add(result, tmp, result);
 736   load_heap_oop(result, arrayOopDesc::base_offset_in_bytes(T_OBJECT), result);
 737 }
 738 
 739 
 740 // load cpool->resolved_klass_at(index)
 741 void InterpreterMacroAssembler::load_resolved_klass_at_offset(Register Rcpool,
 742                                            Register Roffset, Register Rklass) {
 743   // int value = *this_cp->int_at_addr(which);
 744   // int resolved_klass_index = extract_low_short_from_int(value);
 745   //
 746   // Because SPARC is big-endian, the low_short is at (cpool->int_at_addr(which) + 2 bytes)
 747   add(Roffset, Rcpool, Roffset);
 748   lduh(Roffset, sizeof(ConstantPool) + 2, Roffset);  // Roffset = resolved_klass_index
 749 
 750   Register Rresolved_klasses = Rklass;
 751   ld_ptr(Rcpool, ConstantPool::resolved_klasses_offset_in_bytes(), Rresolved_klasses);
 752   sll(Roffset, LogBytesPerWord, Roffset);
 753   add(Roffset, Array<Klass*>::base_offset_in_bytes(), Roffset);


< prev index next >