@@ -1421,9 +1421,8 @@
MacroAssembler _masm(&cbuf);
// no need to worry about 4-byte of br alignment on AArch64
- __ load_klass(rscratch1, j_rarg0);
+ __ cmp_klass(j_rarg0, rscratch2, rscratch1);
Label skip;
- __ cmp(rscratch2, rscratch1);
// TODO
// can we avoid this skip and still use a reloc?
__ br(Assembler::EQ, skip);
@@ -2076,6 +2076,20 @@
}
}
+void MacroAssembler::cmp_klass(Register oop, Register trial_klass, Register tmp) {
+ if (UseCompressedClassPointers) {
+ ldrw(tmp, Address(oop, oopDesc::klass_offset_in_bytes()));
+ if (Universe::narrow_klass_base() == NULL) {
+ cmp(trial_klass, tmp, LSL, Universe::narrow_klass_shift());
+ return;
+ }
+ decode_klass_not_null(tmp);
+ } else {
+ ldr(tmp, Address(oop, oopDesc::klass_offset_in_bytes()));
+ }
+ cmp(trial_klass, tmp);
+}
+
void MacroAssembler::load_prototype_header(Register dst, Register src) {
load_klass(dst, src);
ldr(dst, Address(dst, Klass::prototype_header_offset()));
@@ -703,6 +703,7 @@
// oop manipulations
void load_klass(Register dst, Register src);
void store_klass(Register dst, Register src);
+ void cmp_klass(Register oop, Register trial_klass, Register tmp);
void load_heap_oop(Register dst, Address src);