@@ -492,6 +492,49 @@ void MacroAssembler::wrap_label(Register r, Label &L, reg_addr_insn insn) {
492492 }
493493}
494494
495+ void MacroAssembler::cmp_klass (Register obj1, Register obj2, Register tmp1,
496+ Register tmp2, Label &L, bool equal, bool far) {
497+ if (UseCompactObjectHeaders) {
498+ load_narrow_klass_compact (tmp1, obj1);
499+ load_narrow_klass_compact (tmp2, obj2);
500+ } else if (UseCompressedClassPointers) {
501+ ld_wu (tmp1, Address (obj1, oopDesc::klass_offset_in_bytes ()));
502+ ld_wu (tmp2, Address (obj2, oopDesc::klass_offset_in_bytes ()));
503+ } else {
504+ ld_d (tmp1, Address (obj1, oopDesc::klass_offset_in_bytes ()));
505+ ld_d (tmp1, Address (obj2, oopDesc::klass_offset_in_bytes ()));
506+ }
507+ if (equal) {
508+ if (far) {
509+ beq_far (tmp1, tmp2, L);
510+ } else {
511+ beq (tmp1, tmp2, L);
512+ }
513+ } else {
514+ if (far) {
515+ bne_far (tmp1, tmp2, L);
516+ } else {
517+ bne (tmp1, tmp2, L);
518+ }
519+ }
520+ }
521+
522+ void MacroAssembler::cmp_klass_compressed (Register obj, Register klass,
523+ Register tmp1, Label &L, bool equal) {
524+ if (UseCompactObjectHeaders) {
525+ load_narrow_klass_compact (tmp1, obj);
526+ } else if (UseCompressedClassPointers) {
527+ ld_wu (tmp1, Address (obj, oopDesc::klass_offset_in_bytes ()));
528+ } else {
529+ ld_d (tmp1, Address (obj, oopDesc::klass_offset_in_bytes ()));
530+ }
531+ if (equal) {
532+ beq (tmp1, klass, L);
533+ } else {
534+ bne (tmp1, klass, L);
535+ }
536+ }
537+
495538// Move an oop into a register.
496539void MacroAssembler::movoop (Register dst, jobject obj) {
497540 int oop_index;
@@ -610,7 +653,10 @@ address MacroAssembler::ic_call(address entry, jint method_index) {
610653}
611654
612655int MacroAssembler::ic_check_size () {
613- return 4 * 5 ;
656+ return 4 * (/* beq */ 1 + /* patchable jump(force patchable) */ 2 +
657+ /* load klass */
658+ (UseCompactObjectHeaders ? 3 /* load_narrow_klass_compact + 1 */
659+ : 2 /* ld + ld */ ));
614660}
615661
616662int MacroAssembler::ic_check (int end_alignment) {
@@ -626,7 +672,10 @@ int MacroAssembler::ic_check(int end_alignment) {
626672 align (end_alignment, offset () + ic_check_size ());
627673 int uep_offset = offset ();
628674
629- if (UseCompressedClassPointers) {
675+ if (UseCompactObjectHeaders) {
676+ load_narrow_klass_compact (tmp1, receiver);
677+ ld_wu (tmp2, Address (data, CompiledICData::speculated_klass_offset ()));
678+ } else if (UseCompressedClassPointers) {
630679 ld_wu (tmp1, Address (receiver, oopDesc::klass_offset_in_bytes ()));
631680 ld_wu (tmp2, Address (data, CompiledICData::speculated_klass_offset ()));
632681 } else {
@@ -2049,15 +2098,25 @@ void MacroAssembler::load_method_holder_cld(Register rresult, Register rmethod)
20492098
20502099// for UseCompressedOops Option
20512100void MacroAssembler::load_klass (Register dst, Register src) {
2052- if (UseCompressedClassPointers){
2101+ if (UseCompactObjectHeaders) {
2102+ load_narrow_klass_compact (dst, src);
2103+ decode_klass_not_null (dst);
2104+ } else if (UseCompressedClassPointers) {
20532105 ld_wu (dst, Address (src, oopDesc::klass_offset_in_bytes ()));
20542106 decode_klass_not_null (dst);
20552107 } else {
20562108 ld_d (dst, src, oopDesc::klass_offset_in_bytes ());
20572109 }
20582110}
20592111
2112+ void MacroAssembler::load_narrow_klass_compact (Register dst, Register src) {
2113+ assert (UseCompactObjectHeaders, " expects UseCompactObjectHeaders" );
2114+ ld_d (dst, Address (src, oopDesc::mark_offset_in_bytes ()));
2115+ srli_d (dst, dst, markWord::klass_shift);
2116+ }
2117+
20602118void MacroAssembler::store_klass (Register dst, Register src) {
2119+ assert (!UseCompactObjectHeaders, " not with compact headers" );
20612120 if (UseCompressedClassPointers){
20622121 encode_klass_not_null (src);
20632122 st_w (src, dst, oopDesc::klass_offset_in_bytes ());
@@ -2067,6 +2126,7 @@ void MacroAssembler::store_klass(Register dst, Register src) {
20672126}
20682127
20692128void MacroAssembler::store_klass_gap (Register dst, Register src) {
2129+ assert (!UseCompactObjectHeaders, " not with compact headers" );
20702130 if (UseCompressedClassPointers) {
20712131 st_w (src, dst, oopDesc::klass_gap_offset_in_bytes ());
20722132 }
@@ -2350,8 +2410,7 @@ void MacroAssembler::encode_klass_not_null(Register r) {
23502410 sub_d (r, r, AT);
23512411 }
23522412 if (CompressedKlassPointers::shift () != 0 ) {
2353- assert (LogKlassAlignmentInBytes == CompressedKlassPointers::shift (), " decode alg wrong" );
2354- srli_d (r, r, LogKlassAlignmentInBytes);
2413+ srli_d (r, r, CompressedKlassPointers::shift ());
23552414 }
23562415}
23572416
@@ -2368,13 +2427,11 @@ void MacroAssembler::encode_klass_not_null(Register dst, Register src) {
23682427 li (dst, (int64_t )CompressedKlassPointers::base ());
23692428 sub_d (dst, src, dst);
23702429 if (CompressedKlassPointers::shift () != 0 ) {
2371- assert (LogKlassAlignmentInBytes == CompressedKlassPointers::shift (), " decode alg wrong" );
2372- srli_d (dst, dst, LogKlassAlignmentInBytes);
2430+ srli_d (dst, dst, CompressedKlassPointers::shift ());
23732431 }
23742432 } else {
23752433 if (CompressedKlassPointers::shift () != 0 ) {
2376- assert (LogKlassAlignmentInBytes == CompressedKlassPointers::shift (), " decode alg wrong" );
2377- srli_d (dst, src, LogKlassAlignmentInBytes);
2434+ srli_d (dst, src, CompressedKlassPointers::shift ());
23782435 } else {
23792436 move (dst, src);
23802437 }
@@ -2397,15 +2454,16 @@ void MacroAssembler::decode_klass_not_null(Register r) {
23972454 add_d (r, r, AT);
23982455 }
23992456 } else {
2400- assert (LogKlassAlignmentInBytes == CompressedKlassPointers::shift (), " decode alg wrong " );
2401- assert (LogKlassAlignmentInBytes == Address::times_8, " klass not aligned on 64bits?" );
2457+ assert (CompressedKlassPointers::shift () == Address::times_8,
2458+ " klass not aligned on 64bits?" );
24022459 li (AT, (int64_t )CompressedKlassPointers::base ());
24032460 alsl_d (r, r, AT, Address::times_8 - 1 );
24042461 }
24052462 } else {
24062463 if (CompressedKlassPointers::shift () != 0 ) {
2407- assert (LogKlassAlignmentInBytes == CompressedKlassPointers::shift (), " decode alg wrong" );
2408- slli_d (r, r, LogKlassAlignmentInBytes);
2464+ assert (CompressedKlassPointers::shift () == Address::times_8,
2465+ " klass not aligned on 64bits?" );
2466+ slli_d (r, r, CompressedKlassPointers::shift ());
24092467 }
24102468 }
24112469}
@@ -2428,15 +2486,16 @@ void MacroAssembler::decode_klass_not_null(Register dst, Register src) {
24282486 add_d (dst, dst, src);
24292487 }
24302488 } else {
2431- assert (LogKlassAlignmentInBytes == CompressedKlassPointers::shift (), " decode alg wrong " );
2432- assert (LogKlassAlignmentInBytes == Address::times_8, " klass not aligned on 64bits?" );
2489+ assert (CompressedKlassPointers::shift () == Address::times_8,
2490+ " klass not aligned on 64bits?" );
24332491 li (dst, (int64_t )CompressedKlassPointers::base ());
24342492 alsl_d (dst, src, dst, Address::times_8 - 1 );
24352493 }
24362494 } else {
24372495 if (CompressedKlassPointers::shift () != 0 ) {
2438- assert (LogKlassAlignmentInBytes == CompressedKlassPointers::shift (), " decode alg wrong" );
2439- slli_d (dst, src, LogKlassAlignmentInBytes);
2496+ assert (CompressedKlassPointers::shift () == Address::times_8,
2497+ " klass not aligned on 64bits?" );
2498+ slli_d (dst, src, CompressedKlassPointers::shift ());
24402499 } else {
24412500 move (dst, src);
24422501 }
0 commit comments