2380 } |
2380 } |
2381 |
2381 |
2382 |
2382 |
2383 void MacroAssembler::encode_klass_not_null(Register dst, Register src) { |
2383 void MacroAssembler::encode_klass_not_null(Register dst, Register src) { |
2384 if (src == noreg) src = dst; |
2384 if (src == noreg) src = dst; |
2385 assert(Universe::narrow_klass_base() != NULL, "Base should be initialized"); |
2385 if (Universe::narrow_klass_base() != 0) { |
2386 load_const(R0, Universe::narrow_klass_base()); |
2386 load_const(R0, Universe::narrow_klass_base()); |
2387 sub(dst, src, R0); |
2387 sub(dst, src, R0); |
2388 if (Universe::narrow_klass_shift() != 0) { |
2388 } |
|
2389 if (Universe::narrow_klass_shift() != 0 || |
|
2390 Universe::narrow_klass_base() == 0 && src != dst) { // Move required. |
2389 srdi(dst, src, Universe::narrow_klass_shift()); |
2391 srdi(dst, src, Universe::narrow_klass_shift()); |
2390 } |
2392 } |
2391 } |
2393 } |
2392 |
2394 |
2393 void MacroAssembler::store_klass(Register dst_oop, Register klass, Register ck) { |
2395 void MacroAssembler::store_klass(Register dst_oop, Register klass, Register ck) { |
2397 } else { |
2399 } else { |
2398 std(klass, oopDesc::klass_offset_in_bytes(), dst_oop); |
2400 std(klass, oopDesc::klass_offset_in_bytes(), dst_oop); |
2399 } |
2401 } |
2400 } |
2402 } |
2401 |
2403 |
|
2404 int MacroAssembler::instr_size_for_decode_klass_not_null() { |
|
2405 if (!UseCompressedClassPointers) return 0; |
|
2406 int num_instrs = 1; // shift or move |
|
2407 if (Universe::narrow_klass_base() != 0) num_instrs = 7; // shift + load const + add |
|
2408 return num_instrs * BytesPerInstWord; |
|
2409 } |
|
2410 |
2402 void MacroAssembler::decode_klass_not_null(Register dst, Register src) { |
2411 void MacroAssembler::decode_klass_not_null(Register dst, Register src) { |
2403 if (src == noreg) src = dst; |
2412 if (src == noreg) src = dst; |
2404 Register shifted_src = src; |
2413 Register shifted_src = src; |
2405 assert(Universe::narrow_klass_base() != NULL, "Base should be initialized"); |
2414 if (Universe::narrow_klass_shift() != 0 || |
2406 if (Universe::narrow_klass_shift() != 0) { |
2415 Universe::narrow_klass_base() == 0 && src != dst) { // Move required. |
2407 shifted_src = dst; |
2416 shifted_src = dst; |
2408 sldi(shifted_src, src, Universe::narrow_klass_shift()); |
2417 sldi(shifted_src, src, Universe::narrow_klass_shift()); |
2409 } |
2418 } |
2410 load_const(R0, Universe::narrow_klass_base()); |
2419 if (Universe::narrow_klass_base() != 0) { |
2411 add(dst, shifted_src, R0); |
2420 load_const(R0, Universe::narrow_klass_base()); |
|
2421 add(dst, shifted_src, R0); |
|
2422 } |
2412 } |
2423 } |
2413 |
2424 |
2414 void MacroAssembler::load_klass(Register dst, Register src) { |
2425 void MacroAssembler::load_klass(Register dst, Register src) { |
2415 if (UseCompressedClassPointers) { |
2426 if (UseCompressedClassPointers) { |
2416 lwz(dst, oopDesc::klass_offset_in_bytes(), src); |
2427 lwz(dst, oopDesc::klass_offset_in_bytes(), src); |