5356 // get mirror
5357 const int mirror_offset = in_bytes(Klass::java_mirror_offset());
5358 load_method_holder(mirror, method);
5359 movptr(mirror, Address(mirror, mirror_offset));
5360 resolve_oop_handle(mirror, tmp);
5361 }
5362
5363 void MacroAssembler::load_method_holder_cld(Register rresult, Register rmethod) {
5364 load_method_holder(rresult, rmethod);
5365 movptr(rresult, Address(rresult, InstanceKlass::class_loader_data_offset()));
5366 }
5367
5368 void MacroAssembler::load_method_holder(Register holder, Register method) {
5369 movptr(holder, Address(method, Method::const_offset())); // ConstMethod*
5370 movptr(holder, Address(holder, ConstMethod::constants_offset())); // ConstantPool*
5371 movptr(holder, Address(holder, ConstantPool::pool_holder_offset())); // InstanceKlass*
5372 }
5373
5374 void MacroAssembler::load_narrow_klass_compact(Register dst, Register src) {
5375 assert(UseCompactObjectHeaders, "expect compact object headers");
5376 movq(dst, Address(src, oopDesc::mark_offset_in_bytes()));
5377 shrq(dst, markWord::klass_shift);
5378 }
5379
5380 void MacroAssembler::load_klass(Register dst, Register src, Register tmp) {
5381 assert_different_registers(src, tmp);
5382 assert_different_registers(dst, tmp);
5383
5384 if (UseCompactObjectHeaders) {
5385 load_narrow_klass_compact(dst, src);
5386 decode_klass_not_null(dst, tmp);
5387 } else if (UseCompressedClassPointers) {
5388 movl(dst, Address(src, oopDesc::klass_offset_in_bytes()));
5389 decode_klass_not_null(dst, tmp);
5390 } else {
5391 movptr(dst, Address(src, oopDesc::klass_offset_in_bytes()));
5392 }
5393 }
5394
5395 void MacroAssembler::store_klass(Register dst, Register src, Register tmp) {
5396 assert(!UseCompactObjectHeaders, "not with compact headers");
5397 assert_different_registers(src, tmp);
|
5356 // get mirror
5357 const int mirror_offset = in_bytes(Klass::java_mirror_offset());
5358 load_method_holder(mirror, method);
5359 movptr(mirror, Address(mirror, mirror_offset));
5360 resolve_oop_handle(mirror, tmp);
5361 }
5362
5363 void MacroAssembler::load_method_holder_cld(Register rresult, Register rmethod) {
5364 load_method_holder(rresult, rmethod);
5365 movptr(rresult, Address(rresult, InstanceKlass::class_loader_data_offset()));
5366 }
5367
5368 void MacroAssembler::load_method_holder(Register holder, Register method) {
5369 movptr(holder, Address(method, Method::const_offset())); // ConstMethod*
5370 movptr(holder, Address(holder, ConstMethod::constants_offset())); // ConstantPool*
5371 movptr(holder, Address(holder, ConstantPool::pool_holder_offset())); // InstanceKlass*
5372 }
5373
5374 void MacroAssembler::load_narrow_klass_compact(Register dst, Register src) {
5375 assert(UseCompactObjectHeaders, "expect compact object headers");
5376 movl(dst, Address(src, oopDesc::mark_offset_in_bytes()));
5377 shrl(dst, markWord::klass_shift);
5378 }
5379
5380 void MacroAssembler::load_klass(Register dst, Register src, Register tmp) {
5381 assert_different_registers(src, tmp);
5382 assert_different_registers(dst, tmp);
5383
5384 if (UseCompactObjectHeaders) {
5385 load_narrow_klass_compact(dst, src);
5386 decode_klass_not_null(dst, tmp);
5387 } else if (UseCompressedClassPointers) {
5388 movl(dst, Address(src, oopDesc::klass_offset_in_bytes()));
5389 decode_klass_not_null(dst, tmp);
5390 } else {
5391 movptr(dst, Address(src, oopDesc::klass_offset_in_bytes()));
5392 }
5393 }
5394
5395 void MacroAssembler::store_klass(Register dst, Register src, Register tmp) {
5396 assert(!UseCompactObjectHeaders, "not with compact headers");
5397 assert_different_registers(src, tmp);
|