@@ -1218,6 +1218,9 @@ int MacroAssembler::ic_check_size() {
12181218 num_ins = 7 ;
12191219 if (!implicit_null_checks_available) num_ins += 2 ;
12201220 }
1221+
1222+ if (UseCompactObjectHeaders) num_ins++;
1223+
12211224 return num_ins * BytesPerInstWord;
12221225}
12231226
@@ -1245,7 +1248,9 @@ int MacroAssembler::ic_check(int end_alignment) {
12451248 if (use_trap_based_null_check) {
12461249 trap_null_check (receiver);
12471250 }
1248- if (UseCompressedClassPointers) {
1251+ if (UseCompactObjectHeaders) {
1252+ load_narrow_klass_compact (tmp1, receiver);
1253+ } else if (UseCompressedClassPointers) {
12491254 lwz (tmp1, oopDesc::klass_offset_in_bytes (), receiver);
12501255 } else {
12511256 ld (tmp1, oopDesc::klass_offset_in_bytes (), receiver);
@@ -3239,6 +3244,7 @@ Register MacroAssembler::encode_klass_not_null(Register dst, Register src) {
32393244}
32403245
32413246void MacroAssembler::store_klass (Register dst_oop, Register klass, Register ck) {
3247+ assert (!UseCompactObjectHeaders, " not with compact headers" );
32423248 if (UseCompressedClassPointers) {
32433249 Register compressedKlass = encode_klass_not_null (ck, klass);
32443250 stw (compressedKlass, oopDesc::klass_offset_in_bytes (), dst_oop);
@@ -3248,12 +3254,13 @@ void MacroAssembler::store_klass(Register dst_oop, Register klass, Register ck)
32483254}
32493255
32503256void MacroAssembler::store_klass_gap (Register dst_oop, Register val) {
3257+ assert (!UseCompactObjectHeaders, " not with compact headers" );
32513258 if (UseCompressedClassPointers) {
32523259 if (val == noreg) {
32533260 val = R0;
32543261 li (val, 0 );
32553262 }
3256- stw (val, oopDesc::klass_gap_offset_in_bytes (), dst_oop); // klass gap if compressed
3263+ stw (val, oopDesc::klass_gap_offset_in_bytes (), dst_oop);
32573264 }
32583265}
32593266
@@ -3294,15 +3301,60 @@ void MacroAssembler::decode_klass_not_null(Register dst, Register src) {
32943301}
32953302
32963303void MacroAssembler::load_klass (Register dst, Register src) {
3297- if (UseCompressedClassPointers) {
3304+ if (UseCompactObjectHeaders) {
3305+ load_narrow_klass_compact (dst, src);
3306+ decode_klass_not_null (dst);
3307+ } else if (UseCompressedClassPointers) {
32983308 lwz (dst, oopDesc::klass_offset_in_bytes (), src);
3299- // Attention: no null check here!
3300- decode_klass_not_null (dst, dst);
3309+ decode_klass_not_null (dst);
33013310 } else {
33023311 ld (dst, oopDesc::klass_offset_in_bytes (), src);
33033312 }
33043313}
33053314
3315+ // Loads the obj's Klass* into dst.
3316+ // Preserves all registers (incl src, rscratch1 and rscratch2).
3317+ // Input:
3318+ // src - the oop we want to load the klass from.
3319+ // dst - output nklass.
3320+ void MacroAssembler::load_narrow_klass_compact (Register dst, Register src) {
3321+ assert (UseCompactObjectHeaders, " expects UseCompactObjectHeaders" );
3322+ ld (dst, oopDesc::mark_offset_in_bytes (), src);
3323+ srdi (dst, dst, markWord::klass_shift);
3324+ }
3325+
3326+ void MacroAssembler::cmp_klass (ConditionRegister dst, Register obj, Register klass, Register tmp, Register tmp2) {
3327+ assert_different_registers (obj, klass, tmp);
3328+ if (UseCompressedClassPointers) {
3329+ if (UseCompactObjectHeaders) {
3330+ load_narrow_klass_compact (tmp, obj);
3331+ } else {
3332+ lwz (tmp, oopDesc::klass_offset_in_bytes (), obj);
3333+ }
3334+ Register encoded_klass = encode_klass_not_null (tmp2, klass);
3335+ cmpw (dst, tmp, encoded_klass);
3336+ } else {
3337+ ld (tmp, oopDesc::klass_offset_in_bytes (), obj);
3338+ cmpd (dst, tmp, klass);
3339+ }
3340+ }
3341+
3342+ void MacroAssembler::cmp_klasses_from_objects (ConditionRegister dst, Register obj1, Register obj2, Register tmp1, Register tmp2) {
3343+ if (UseCompactObjectHeaders) {
3344+ load_narrow_klass_compact (tmp1, obj1);
3345+ load_narrow_klass_compact (tmp2, obj2);
3346+ cmpw (dst, tmp1, tmp2);
3347+ } else if (UseCompressedClassPointers) {
3348+ lwz (tmp1, oopDesc::klass_offset_in_bytes (), obj1);
3349+ lwz (tmp2, oopDesc::klass_offset_in_bytes (), obj2);
3350+ cmpw (dst, tmp1, tmp2);
3351+ } else {
3352+ ld (tmp1, oopDesc::klass_offset_in_bytes (), obj1);
3353+ ld (tmp2, oopDesc::klass_offset_in_bytes (), obj2);
3354+ cmpd (dst, tmp1, tmp2);
3355+ }
3356+ }
3357+
33063358void MacroAssembler::load_klass_check_null (Register dst, Register src, Label* is_null) {
33073359 null_check (src, oopDesc::klass_offset_in_bytes (), is_null);
33083360 load_klass (dst, src);
0 commit comments