< prev index next >

src/cpu/s390/vm/interp_masm_s390.cpp

Print this page




 347   assert(ConstantPoolCacheEntry::bytecode_1_mask == 0xff, "");
 348   load_sized_value(bytecode, Address(cache, cpe_offset, base_ix_off+off_in_DW), 1, false /*signed*/);
 349 
 350   BLOCK_COMMENT("}");
 351 }
 352 
 353 // Load object from cpool->resolved_references(index).
 354 void InterpreterMacroAssembler::load_resolved_reference_at_index(Register result, Register index) {
 355   assert_different_registers(result, index);
 356   get_constant_pool(result);
 357 
 358   // Convert
 359   //  - from field index to resolved_references() index and
 360   //  - from word index to byte offset.
 361   // Since this is a java object, it is potentially compressed.
 362   Register tmp = index;  // reuse
 363   z_sllg(index, index, LogBytesPerHeapOop); // Offset into resolved references array.
 364   // Load pointer for resolved_references[] objArray.
 365   z_lg(result, ConstantPool::cache_offset_in_bytes(), result);
 366   z_lg(result, ConstantPoolCache::resolved_references_offset_in_bytes(), result);
 367   // JNIHandles::resolve(result)
 368   z_lg(result, 0, result); // Load resolved references array itself.
 369 #ifdef ASSERT
 370   NearLabel index_ok;
 371   z_lgf(Z_R0, Address(result, arrayOopDesc::length_offset_in_bytes()));
 372   z_sllg(Z_R0, Z_R0, LogBytesPerHeapOop);
 373   compare64_and_branch(tmp, Z_R0, Assembler::bcondLow, index_ok);
 374   stop("resolved reference index out of bounds", 0x09256);
 375   bind(index_ok);
 376 #endif
 377   z_agr(result, index);    // Address of indexed array element.
 378   load_heap_oop(result, arrayOopDesc::base_offset_in_bytes(T_OBJECT), result);
 379 }
 380 
 381 // load cpool->resolved_klass_at(index)
 382 void InterpreterMacroAssembler::load_resolved_klass_at_offset(Register cpool, Register offset, Register iklass) {
 383   // int value = *(Rcpool->int_at_addr(which));
 384   // int resolved_klass_index = extract_low_short_from_int(value);
 385   z_llgh(offset, Address(cpool, offset, sizeof(ConstantPool) + 2)); // offset = resolved_klass_index (s390 is big-endian)
 386   z_sllg(offset, offset, LogBytesPerWord);                          // Convert 'index' to 'offset'
 387   z_lg(iklass, Address(cpool, ConstantPool::resolved_klasses_offset_in_bytes())); // iklass = cpool->_resolved_klasses
 388   z_lg(iklass, Address(iklass, offset, Array<Klass*>::base_offset_in_bytes()));




 347   assert(ConstantPoolCacheEntry::bytecode_1_mask == 0xff, "");
 348   load_sized_value(bytecode, Address(cache, cpe_offset, base_ix_off+off_in_DW), 1, false /*signed*/);
 349 
 350   BLOCK_COMMENT("}");
 351 }
 352 
 353 // Load object from cpool->resolved_references(index).
 354 void InterpreterMacroAssembler::load_resolved_reference_at_index(Register result, Register index) {
 355   assert_different_registers(result, index);
 356   get_constant_pool(result);
 357 
 358   // Convert
 359   //  - from field index to resolved_references() index and
 360   //  - from word index to byte offset.
 361   // Since this is a java object, it is potentially compressed.
 362   Register tmp = index;  // reuse
 363   z_sllg(index, index, LogBytesPerHeapOop); // Offset into resolved references array.
 364   // Load pointer for resolved_references[] objArray.
 365   z_lg(result, ConstantPool::cache_offset_in_bytes(), result);
 366   z_lg(result, ConstantPoolCache::resolved_references_offset_in_bytes(), result);
 367   resolve_oop_handle(result); // Load resolved references array itself.

 368 #ifdef ASSERT
 369   NearLabel index_ok;
 370   z_lgf(Z_R0, Address(result, arrayOopDesc::length_offset_in_bytes()));
 371   z_sllg(Z_R0, Z_R0, LogBytesPerHeapOop);
 372   compare64_and_branch(tmp, Z_R0, Assembler::bcondLow, index_ok);
 373   stop("resolved reference index out of bounds", 0x09256);
 374   bind(index_ok);
 375 #endif
 376   z_agr(result, index);    // Address of indexed array element.
 377   load_heap_oop(result, arrayOopDesc::base_offset_in_bytes(T_OBJECT), result);
 378 }
 379 
 380 // load cpool->resolved_klass_at(index)
 381 void InterpreterMacroAssembler::load_resolved_klass_at_offset(Register cpool, Register offset, Register iklass) {
 382   // int value = *(Rcpool->int_at_addr(which));
 383   // int resolved_klass_index = extract_low_short_from_int(value);
 384   z_llgh(offset, Address(cpool, offset, sizeof(ConstantPool) + 2)); // offset = resolved_klass_index (s390 is big-endian)
 385   z_sllg(offset, offset, LogBytesPerWord);                          // Convert 'index' to 'offset'
 386   z_lg(iklass, Address(cpool, ConstantPool::resolved_klasses_offset_in_bytes())); // iklass = cpool->_resolved_klasses
 387   z_lg(iklass, Address(iklass, offset, Array<Klass*>::base_offset_in_bytes()));


< prev index next >