3355 if (Universe::narrow_klass_shift() != 0 || 3356 Universe::narrow_klass_base() == 0 && src != dst) { // Move required. 3357 shifted_src = dst; 3358 sldi(shifted_src, src, Universe::narrow_klass_shift()); 3359 } 3360 if (Universe::narrow_klass_base() != 0) { 3361 add_const_optimized(dst, shifted_src, Universe::narrow_klass_base(), R0); 3362 } 3363 } 3364 3365 void MacroAssembler::load_klass(Register dst, Register src) { 3366 if (UseCompressedClassPointers) { 3367 lwz(dst, oopDesc::klass_offset_in_bytes(), src); 3368 // Attention: no null check here! 3369 decode_klass_not_null(dst, dst); 3370 } else { 3371 ld(dst, oopDesc::klass_offset_in_bytes(), src); 3372 } 3373 } 3374 3375 void MacroAssembler::load_mirror_from_const_method(Register mirror, Register const_method) { 3376 ld(mirror, in_bytes(ConstMethod::constants_offset()), const_method); 3377 ld(mirror, ConstantPool::pool_holder_offset_in_bytes(), mirror); 3378 ld(mirror, in_bytes(Klass::java_mirror_offset()), mirror); 3379 } 3380 3381 // Clear Array 3382 // For very short arrays. tmp == R0 is allowed. 3383 void MacroAssembler::clear_memory_unrolled(Register base_ptr, int cnt_dwords, Register tmp, int offset) { 3384 if (cnt_dwords > 0) { li(tmp, 0); } 3385 for (int i = 0; i < cnt_dwords; ++i) { std(tmp, offset + i * 8, base_ptr); } 3386 } 3387 3388 // Version for constant short array length. Kills base_ptr. tmp == R0 is allowed. 3389 void MacroAssembler::clear_memory_constlen(Register base_ptr, int cnt_dwords, Register tmp) { 3390 if (cnt_dwords < 8) { 3391 clear_memory_unrolled(base_ptr, cnt_dwords, tmp); 3392 return; 3393 } 3394 | 3355 if (Universe::narrow_klass_shift() != 0 || 3356 Universe::narrow_klass_base() == 0 && src != dst) { // Move required. 3357 shifted_src = dst; 3358 sldi(shifted_src, src, Universe::narrow_klass_shift()); 3359 } 3360 if (Universe::narrow_klass_base() != 0) { 3361 add_const_optimized(dst, shifted_src, Universe::narrow_klass_base(), R0); 3362 } 3363 } 3364 3365 void MacroAssembler::load_klass(Register dst, Register src) { 3366 if (UseCompressedClassPointers) { 3367 lwz(dst, oopDesc::klass_offset_in_bytes(), src); 3368 // Attention: no null check here! 3369 decode_klass_not_null(dst, dst); 3370 } else { 3371 ld(dst, oopDesc::klass_offset_in_bytes(), src); 3372 } 3373 } 3374 3375 // ((OopHandle)result).resolve(); 3376 void MacroAssembler::resolve_oop_handle(Register result) { 3377 // OopHandle::resolve is an indirection. 3378 ld(result, 0, result); 3379 } 3380 3381 void MacroAssembler::load_mirror_from_const_method(Register mirror, Register const_method) { 3382 ld(mirror, in_bytes(ConstMethod::constants_offset()), const_method); 3383 ld(mirror, ConstantPool::pool_holder_offset_in_bytes(), mirror); 3384 ld(mirror, in_bytes(Klass::java_mirror_offset()), mirror); 3385 } 3386 3387 // Clear Array 3388 // For very short arrays. tmp == R0 is allowed. 3389 void MacroAssembler::clear_memory_unrolled(Register base_ptr, int cnt_dwords, Register tmp, int offset) { 3390 if (cnt_dwords > 0) { li(tmp, 0); } 3391 for (int i = 0; i < cnt_dwords; ++i) { std(tmp, offset + i * 8, base_ptr); } 3392 } 3393 3394 // Version for constant short array length. Kills base_ptr. tmp == R0 is allowed. 3395 void MacroAssembler::clear_memory_constlen(Register base_ptr, int cnt_dwords, Register tmp) { 3396 if (cnt_dwords < 8) { 3397 clear_memory_unrolled(base_ptr, cnt_dwords, tmp); 3398 return; 3399 } 3400 |