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()));
|