15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
24
25 #include "precompiled.hpp"
26 #include "interp_masm_x86.hpp"
27 #include "interpreter/interpreter.hpp"
28 #include "interpreter/interpreterRuntime.hpp"
29 #include "logging/log.hpp"
30 #include "memory/vtBuffer.hpp"
31 #include "oops/arrayOop.hpp"
32 #include "oops/markOop.hpp"
33 #include "oops/methodData.hpp"
34 #include "oops/method.hpp"
35 #include "prims/jvmtiExport.hpp"
36 #include "prims/jvmtiThreadState.hpp"
37 #include "runtime/basicLock.hpp"
38 #include "runtime/biasedLocking.hpp"
39 #include "runtime/sharedRuntime.hpp"
40 #include "runtime/thread.inline.hpp"
41
42 // Implementation of InterpreterMacroAssembler
43
44 void InterpreterMacroAssembler::jump_to_entry(address entry) {
45 assert(entry, "Entry must have been generated by now");
46 jump(RuntimeAddress(entry));
47 }
48
49 void InterpreterMacroAssembler::profile_obj_type(Register obj, const Address& mdo_addr) {
50 Label update, next, none;
51
52 verify_oop(obj);
53
54 testptr(obj, obj);
1111
1112 NOT_LP64(get_thread(rthread);)
1113
1114 cmpl(Address(rthread, JavaThread::stack_guard_state_offset()), JavaThread::stack_guard_enabled);
1115 jcc(Assembler::equal, no_reserved_zone_enabling);
1116
1117 cmpptr(rbx, Address(rthread, JavaThread::reserved_stack_activation_offset()));
1118 jcc(Assembler::lessEqual, no_reserved_zone_enabling);
1119
1120 call_VM_leaf(
1121 CAST_FROM_FN_PTR(address, SharedRuntime::enable_stack_reserved_zone), rthread);
1122 push(rthread);
1123 call_VM(noreg, CAST_FROM_FN_PTR(address,
1124 InterpreterRuntime::throw_delayed_StackOverflowError));
1125 should_not_reach_here();
1126
1127 bind(no_reserved_zone_enabling);
1128 }
1129 if (load_values) {
1130 // We are returning a value type, load its fields into registers
1131 super_call_VM_leaf(StubRoutines::load_value_type_fields_in_regs());
1132
1133 // call above kills the value in rbx. Reload it.
1134 movptr(rbx, Address(rbp, frame::interpreter_frame_sender_sp_offset * wordSize));
1135 }
1136 leave(); // remove frame anchor
1137 pop(ret_addr); // get return address
1138 mov(rsp, rbx); // set sp to sender sp
1139 }
1140
1141 void InterpreterMacroAssembler::get_method_counters(Register method,
1142 Register mcs, Label& skip) {
1143 Label has_counters;
1144 movptr(mcs, Address(method, Method::method_counters_offset()));
1145 testptr(mcs, mcs);
1146 jcc(Assembler::notZero, has_counters);
1147 call_VM(noreg, CAST_FROM_FN_PTR(address,
1148 InterpreterRuntime::build_method_counters), method);
1149 movptr(mcs, Address(method,Method::method_counters_offset()));
1150 testptr(mcs, mcs);
1151 jcc(Assembler::zero, skip); // No MethodCounters allocated, OutOfMemory
1152 bind(has_counters);
|
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
24
25 #include "precompiled.hpp"
26 #include "interp_masm_x86.hpp"
27 #include "interpreter/interpreter.hpp"
28 #include "interpreter/interpreterRuntime.hpp"
29 #include "logging/log.hpp"
30 #include "memory/vtBuffer.hpp"
31 #include "oops/arrayOop.hpp"
32 #include "oops/markOop.hpp"
33 #include "oops/methodData.hpp"
34 #include "oops/method.hpp"
35 #include "oops/valueKlass.hpp"
36 #include "prims/jvmtiExport.hpp"
37 #include "prims/jvmtiThreadState.hpp"
38 #include "runtime/basicLock.hpp"
39 #include "runtime/biasedLocking.hpp"
40 #include "runtime/sharedRuntime.hpp"
41 #include "runtime/thread.inline.hpp"
42
43 // Implementation of InterpreterMacroAssembler
44
45 void InterpreterMacroAssembler::jump_to_entry(address entry) {
46 assert(entry, "Entry must have been generated by now");
47 jump(RuntimeAddress(entry));
48 }
49
50 void InterpreterMacroAssembler::profile_obj_type(Register obj, const Address& mdo_addr) {
51 Label update, next, none;
52
53 verify_oop(obj);
54
55 testptr(obj, obj);
1112
1113 NOT_LP64(get_thread(rthread);)
1114
1115 cmpl(Address(rthread, JavaThread::stack_guard_state_offset()), JavaThread::stack_guard_enabled);
1116 jcc(Assembler::equal, no_reserved_zone_enabling);
1117
1118 cmpptr(rbx, Address(rthread, JavaThread::reserved_stack_activation_offset()));
1119 jcc(Assembler::lessEqual, no_reserved_zone_enabling);
1120
1121 call_VM_leaf(
1122 CAST_FROM_FN_PTR(address, SharedRuntime::enable_stack_reserved_zone), rthread);
1123 push(rthread);
1124 call_VM(noreg, CAST_FROM_FN_PTR(address,
1125 InterpreterRuntime::throw_delayed_StackOverflowError));
1126 should_not_reach_here();
1127
1128 bind(no_reserved_zone_enabling);
1129 }
1130 if (load_values) {
1131 // We are returning a value type, load its fields into registers
1132 #ifndef _LP64
1133 super_call_VM_leaf(StubRoutines::load_value_type_fields_in_regs());
1134 #else
1135 load_klass(rdi, rax);
1136 movptr(rdi, Address(rdi, ValueKlass::unpack_handler_offset()));
1137
1138 Label skip;
1139 testptr(rdi, rdi);
1140 jcc(Assembler::equal, skip);
1141
1142 // Load fields from a buffered value with a value class specific
1143 // handler
1144 call(rdi);
1145
1146 bind(skip);
1147 #endif
1148 // call above kills the value in rbx. Reload it.
1149 movptr(rbx, Address(rbp, frame::interpreter_frame_sender_sp_offset * wordSize));
1150 }
1151 leave(); // remove frame anchor
1152 pop(ret_addr); // get return address
1153 mov(rsp, rbx); // set sp to sender sp
1154 }
1155
1156 void InterpreterMacroAssembler::get_method_counters(Register method,
1157 Register mcs, Label& skip) {
1158 Label has_counters;
1159 movptr(mcs, Address(method, Method::method_counters_offset()));
1160 testptr(mcs, mcs);
1161 jcc(Assembler::notZero, has_counters);
1162 call_VM(noreg, CAST_FROM_FN_PTR(address,
1163 InterpreterRuntime::build_method_counters), method);
1164 movptr(mcs, Address(method,Method::method_counters_offset()));
1165 testptr(mcs, mcs);
1166 jcc(Assembler::zero, skip); // No MethodCounters allocated, OutOfMemory
1167 bind(has_counters);
|