447 if (is_signed == Signed) {
448 lwa(Rdst, offset, Rsrc);
449 } else {
450 lwz(Rdst, offset, Rsrc);
451 }
452 #endif
453 }
454
455 // Load object from cpool->resolved_references(index).
456 void InterpreterMacroAssembler::load_resolved_reference_at_index(Register result, Register index, Label *is_null) {
457 assert_different_registers(result, index);
458 get_constant_pool(result);
459
460 // Convert from field index to resolved_references() index and from
461 // word index to byte offset. Since this is a java object, it can be compressed.
462 Register tmp = index; // reuse
463 sldi(tmp, index, LogBytesPerHeapOop);
464 // Load pointer for resolved_references[] objArray.
465 ld(result, ConstantPool::cache_offset_in_bytes(), result);
466 ld(result, ConstantPoolCache::resolved_references_offset_in_bytes(), result);
467 // JNIHandles::resolve(result)
468 ld(result, 0, result);
469 #ifdef ASSERT
470 Label index_ok;
471 lwa(R0, arrayOopDesc::length_offset_in_bytes(), result);
472 sldi(R0, R0, LogBytesPerHeapOop);
473 cmpd(CCR0, tmp, R0);
474 blt(CCR0, index_ok);
475 stop("resolved reference index out of bounds", 0x09256);
476 bind(index_ok);
477 #endif
478 // Add in the index.
479 add(result, tmp, result);
480 load_heap_oop(result, arrayOopDesc::base_offset_in_bytes(T_OBJECT), result, is_null);
481 }
482
483 // load cpool->resolved_klass_at(index)
484 void InterpreterMacroAssembler::load_resolved_klass_at_offset(Register Rcpool, Register Roffset, Register Rklass) {
485 // int value = *(Rcpool->int_at_addr(which));
486 // int resolved_klass_index = extract_low_short_from_int(value);
487 add(Roffset, Rcpool, Roffset);
488 #if defined(VM_LITTLE_ENDIAN)
|
447 if (is_signed == Signed) {
448 lwa(Rdst, offset, Rsrc);
449 } else {
450 lwz(Rdst, offset, Rsrc);
451 }
452 #endif
453 }
454
455 // Load object from cpool->resolved_references(index).
456 void InterpreterMacroAssembler::load_resolved_reference_at_index(Register result, Register index, Label *is_null) {
457 assert_different_registers(result, index);
458 get_constant_pool(result);
459
460 // Convert from field index to resolved_references() index and from
461 // word index to byte offset. Since this is a java object, it can be compressed.
462 Register tmp = index; // reuse
463 sldi(tmp, index, LogBytesPerHeapOop);
464 // Load pointer for resolved_references[] objArray.
465 ld(result, ConstantPool::cache_offset_in_bytes(), result);
466 ld(result, ConstantPoolCache::resolved_references_offset_in_bytes(), result);
467 resolve_oop_handle(result);
468 #ifdef ASSERT
469 Label index_ok;
470 lwa(R0, arrayOopDesc::length_offset_in_bytes(), result);
471 sldi(R0, R0, LogBytesPerHeapOop);
472 cmpd(CCR0, tmp, R0);
473 blt(CCR0, index_ok);
474 stop("resolved reference index out of bounds", 0x09256);
475 bind(index_ok);
476 #endif
477 // Add in the index.
478 add(result, tmp, result);
479 load_heap_oop(result, arrayOopDesc::base_offset_in_bytes(T_OBJECT), result, is_null);
480 }
481
482 // load cpool->resolved_klass_at(index)
483 void InterpreterMacroAssembler::load_resolved_klass_at_offset(Register Rcpool, Register Roffset, Register Rklass) {
484 // int value = *(Rcpool->int_at_addr(which));
485 // int resolved_klass_index = extract_low_short_from_int(value);
486 add(Roffset, Rcpool, Roffset);
487 #if defined(VM_LITTLE_ENDIAN)
|