2090 "inconsistent calls_vm information"); // call in remove_activation
2091
2092 if (_desc->bytecode() == Bytecodes::_return_register_finalizer) {
2093 assert(state == vtos, "only valid state");
2094
2095 __ ld(c_rarg1, aaddress(0));
2096 __ load_klass(x13, c_rarg1);
2097 __ lbu(x13, Address(x13, Klass::misc_flags_offset()));
2098 Label skip_register_finalizer;
2099 __ test_bit(t0, x13, exact_log2(KlassFlags::_misc_has_finalizer));
2100 __ beqz(t0, skip_register_finalizer);
2101
2102 __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::register_finalizer), c_rarg1);
2103
2104 __ bind(skip_register_finalizer);
2105 }
2106
2107 // Issue a StoreStore barrier after all stores but before return
2108 // from any constructor for any class with a final field. We don't
2109 // know if this is a finalizer, so we always do so.
2110 if (_desc->bytecode() == Bytecodes::_return) {
2111 __ membar(MacroAssembler::StoreStore);
2112 }
2113
2114 if (_desc->bytecode() != Bytecodes::_return_register_finalizer) {
2115 Label no_safepoint;
2116 __ ld(t0, Address(xthread, JavaThread::polling_word_offset()));
2117 __ test_bit(t0, t0, exact_log2(SafepointMechanism::poll_bit()));
2118 __ beqz(t0, no_safepoint);
2119 __ push(state);
2120 __ push_cont_fastpath(xthread);
2121 __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::at_safepoint));
2122 __ pop_cont_fastpath(xthread);
2123 __ pop(state);
2124 __ bind(no_safepoint);
2125 }
2126
2127 // Narrow result if state is itos but result type is smaller.
2128 // Need to narrow in the return bytecode rather than in generate_return_entry
2129 // since compiled code callers expect the result to already be narrowed.
2130 if (state == itos) {
|
2090 "inconsistent calls_vm information"); // call in remove_activation
2091
2092 if (_desc->bytecode() == Bytecodes::_return_register_finalizer) {
2093 assert(state == vtos, "only valid state");
2094
2095 __ ld(c_rarg1, aaddress(0));
2096 __ load_klass(x13, c_rarg1);
2097 __ lbu(x13, Address(x13, Klass::misc_flags_offset()));
2098 Label skip_register_finalizer;
2099 __ test_bit(t0, x13, exact_log2(KlassFlags::_misc_has_finalizer));
2100 __ beqz(t0, skip_register_finalizer);
2101
2102 __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::register_finalizer), c_rarg1);
2103
2104 __ bind(skip_register_finalizer);
2105 }
2106
2107 // Issue a StoreStore barrier after all stores but before return
2108 // from any constructor for any class with a final field. We don't
2109 // know if this is a finalizer, so we always do so.
2110 if (_desc->bytecode() == Bytecodes::_return
2111 || _desc->bytecode() == Bytecodes::_return_register_finalizer) {
2112 __ membar(MacroAssembler::StoreStore);
2113 }
2114
2115 if (_desc->bytecode() != Bytecodes::_return_register_finalizer) {
2116 Label no_safepoint;
2117 __ ld(t0, Address(xthread, JavaThread::polling_word_offset()));
2118 __ test_bit(t0, t0, exact_log2(SafepointMechanism::poll_bit()));
2119 __ beqz(t0, no_safepoint);
2120 __ push(state);
2121 __ push_cont_fastpath(xthread);
2122 __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::at_safepoint));
2123 __ pop_cont_fastpath(xthread);
2124 __ pop(state);
2125 __ bind(no_safepoint);
2126 }
2127
2128 // Narrow result if state is itos but result type is smaller.
2129 // Need to narrow in the return bytecode rather than in generate_return_entry
2130 // since compiled code callers expect the result to already be narrowed.
2131 if (state == itos) {
|