< prev index next >

src/hotspot/cpu/aarch64/interp_masm_aarch64.cpp

Print this page

1606   // super call
1607   MacroAssembler::call_VM_base(oop_result, noreg, last_java_sp,
1608                                entry_point, number_of_arguments,
1609                      check_exceptions);
1610 // interpreter specific
1611   restore_bcp();
1612   restore_locals();
1613 }
1614 
1615 void InterpreterMacroAssembler::profile_obj_type(Register obj, const Address& mdo_addr) {
1616   assert_different_registers(obj, rscratch1);
1617   Label update, next, none;
1618 
1619   verify_oop(obj);
1620 
1621   cbnz(obj, update);
1622   orptr(mdo_addr, TypeEntries::null_seen);
1623   b(next);
1624 
1625   bind(update);
1626   load_klass(obj, obj);

1627 
1628   ldr(rscratch1, mdo_addr);
1629   eor(obj, obj, rscratch1);
1630   tst(obj, TypeEntries::type_klass_mask);
1631   br(Assembler::EQ, next); // klass seen before, nothing to
1632                            // do. The unknown bit may have been
1633                            // set already but no need to check.
1634 
1635   tbnz(obj, exact_log2(TypeEntries::type_unknown), next);
1636   // already unknown. Nothing to do anymore.
1637 
1638   ldr(rscratch1, mdo_addr);
1639   cbz(rscratch1, none);
1640   cmp(rscratch1, (u1)TypeEntries::null_seen);
1641   br(Assembler::EQ, none);
1642   // There is a chance that the checks above (re-reading profiling
1643   // data from memory) fail if another thread has just set the
1644   // profiling to this obj's klass
1645   ldr(rscratch1, mdo_addr);
1646   eor(obj, obj, rscratch1);

1606   // super call
1607   MacroAssembler::call_VM_base(oop_result, noreg, last_java_sp,
1608                                entry_point, number_of_arguments,
1609                      check_exceptions);
1610 // interpreter specific
1611   restore_bcp();
1612   restore_locals();
1613 }
1614 
1615 void InterpreterMacroAssembler::profile_obj_type(Register obj, const Address& mdo_addr) {
1616   assert_different_registers(obj, rscratch1);
1617   Label update, next, none;
1618 
1619   verify_oop(obj);
1620 
1621   cbnz(obj, update);
1622   orptr(mdo_addr, TypeEntries::null_seen);
1623   b(next);
1624 
1625   bind(update);
1626   load_klass(rscratch1, obj);
1627   mov(obj, rscratch1);
1628 
1629   ldr(rscratch1, mdo_addr);
1630   eor(obj, obj, rscratch1);
1631   tst(obj, TypeEntries::type_klass_mask);
1632   br(Assembler::EQ, next); // klass seen before, nothing to
1633                            // do. The unknown bit may have been
1634                            // set already but no need to check.
1635 
1636   tbnz(obj, exact_log2(TypeEntries::type_unknown), next);
1637   // already unknown. Nothing to do anymore.
1638 
1639   ldr(rscratch1, mdo_addr);
1640   cbz(rscratch1, none);
1641   cmp(rscratch1, (u1)TypeEntries::null_seen);
1642   br(Assembler::EQ, none);
1643   // There is a chance that the checks above (re-reading profiling
1644   // data from memory) fail if another thread has just set the
1645   // profiling to this obj's klass
1646   ldr(rscratch1, mdo_addr);
1647   eor(obj, obj, rscratch1);
< prev index next >