1 /* 2 * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 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 "asm/macroAssembler.hpp" 27 #include "interpreter/bytecodeHistogram.hpp" 28 #include "interpreter/interpreter.hpp" 29 #include "interpreter/interpreterRuntime.hpp" 30 #include "interpreter/interp_masm.hpp" 31 #include "interpreter/templateInterpreterGenerator.hpp" 32 #include "interpreter/templateTable.hpp" 33 #include "oops/arrayOop.hpp" 34 #include "oops/methodData.hpp" 35 #include "oops/method.hpp" 36 #include "oops/oop.inline.hpp" 37 #include "prims/jvmtiExport.hpp" 38 #include "prims/jvmtiThreadState.hpp" 39 #include "prims/methodHandles.hpp" 40 #include "runtime/arguments.hpp" 41 #include "runtime/frame.inline.hpp" 42 #include "runtime/sharedRuntime.hpp" 43 #include "runtime/stubRoutines.hpp" 44 #include "runtime/synchronizer.hpp" 45 #include "runtime/timer.hpp" 46 #include "runtime/vframeArray.hpp" 47 #include "utilities/debug.hpp" 48 #ifdef COMPILER1 49 #include "c1/c1_Runtime1.hpp" 50 #endif 51 52 53 54 // Generation of Interpreter 55 // 56 // The TemplateInterpreterGenerator generates the interpreter into Interpreter::_code. 57 58 59 #define __ _masm-> 60 61 62 //---------------------------------------------------------------------------------------------------- 63 64 #ifndef _LP64 65 address AbstractInterpreterGenerator::generate_slow_signature_handler() { 66 address entry = __ pc(); 67 Argument argv(0, true); 68 69 // We are in the jni transition frame. Save the last_java_frame corresponding to the 70 // outer interpreter frame 71 // 72 __ set_last_Java_frame(FP, noreg); 73 // make sure the interpreter frame we've pushed has a valid return pc 74 __ mov(O7, I7); 75 __ mov(Lmethod, G3_scratch); 76 __ mov(Llocals, G4_scratch); 77 __ save_frame(0); 78 __ mov(G2_thread, L7_thread_cache); 79 __ add(argv.address_in_frame(), O3); 80 __ mov(G2_thread, O0); 81 __ mov(G3_scratch, O1); 82 __ call(CAST_FROM_FN_PTR(address, InterpreterRuntime::slow_signature_handler), relocInfo::runtime_call_type); 83 __ delayed()->mov(G4_scratch, O2); 84 __ mov(L7_thread_cache, G2_thread); 85 __ reset_last_Java_frame(); 86 87 // load the register arguments (the C code packed them as varargs) 88 for (Argument ldarg = argv.successor(); ldarg.is_register(); ldarg = ldarg.successor()) { 89 __ ld_ptr(ldarg.address_in_frame(), ldarg.as_register()); 90 } 91 __ ret(); 92 __ delayed()-> 93 restore(O0, 0, Lscratch); // caller's Lscratch gets the result handler 94 return entry; 95 } 96 97 98 #else 99 // LP64 passes floating point arguments in F1, F3, F5, etc. instead of 100 // O0, O1, O2 etc.. 101 // Doubles are passed in D0, D2, D4 102 // We store the signature of the first 16 arguments in the first argument 103 // slot because it will be overwritten prior to calling the native 104 // function, with the pointer to the JNIEnv. 105 // If LP64 there can be up to 16 floating point arguments in registers 106 // or 6 integer registers. 107 address AbstractInterpreterGenerator::generate_slow_signature_handler() { 108 109 enum { 110 non_float = 0, 111 float_sig = 1, 112 double_sig = 2, 113 sig_mask = 3 114 }; 115 116 address entry = __ pc(); 117 Argument argv(0, true); 118 119 // We are in the jni transition frame. Save the last_java_frame corresponding to the 120 // outer interpreter frame 121 // 122 __ set_last_Java_frame(FP, noreg); 123 // make sure the interpreter frame we've pushed has a valid return pc 124 __ mov(O7, I7); 125 __ mov(Lmethod, G3_scratch); 126 __ mov(Llocals, G4_scratch); 127 __ save_frame(0); 128 __ mov(G2_thread, L7_thread_cache); 129 __ add(argv.address_in_frame(), O3); 130 __ mov(G2_thread, O0); 131 __ mov(G3_scratch, O1); 132 __ call(CAST_FROM_FN_PTR(address, InterpreterRuntime::slow_signature_handler), relocInfo::runtime_call_type); 133 __ delayed()->mov(G4_scratch, O2); 134 __ mov(L7_thread_cache, G2_thread); 135 __ reset_last_Java_frame(); 136 137 138 // load the register arguments (the C code packed them as varargs) 139 Address Sig = argv.address_in_frame(); // Argument 0 holds the signature 140 __ ld_ptr( Sig, G3_scratch ); // Get register argument signature word into G3_scratch 141 __ mov( G3_scratch, G4_scratch); 142 __ srl( G4_scratch, 2, G4_scratch); // Skip Arg 0 143 Label done; 144 for (Argument ldarg = argv.successor(); ldarg.is_float_register(); ldarg = ldarg.successor()) { 145 Label NonFloatArg; 146 Label LoadFloatArg; 147 Label LoadDoubleArg; 148 Label NextArg; 149 Address a = ldarg.address_in_frame(); 150 __ andcc(G4_scratch, sig_mask, G3_scratch); 151 __ br(Assembler::zero, false, Assembler::pt, NonFloatArg); 152 __ delayed()->nop(); 153 154 __ cmp(G3_scratch, float_sig ); 155 __ br(Assembler::equal, false, Assembler::pt, LoadFloatArg); 156 __ delayed()->nop(); 157 158 __ cmp(G3_scratch, double_sig ); 159 __ br(Assembler::equal, false, Assembler::pt, LoadDoubleArg); 160 __ delayed()->nop(); 161 162 __ bind(NonFloatArg); 163 // There are only 6 integer register arguments! 164 if ( ldarg.is_register() ) 165 __ ld_ptr(ldarg.address_in_frame(), ldarg.as_register()); 166 else { 167 // Optimization, see if there are any more args and get out prior to checking 168 // all 16 float registers. My guess is that this is rare. 169 // If is_register is false, then we are done the first six integer args. 170 __ br_null_short(G4_scratch, Assembler::pt, done); 171 } 172 __ ba(NextArg); 173 __ delayed()->srl( G4_scratch, 2, G4_scratch ); 174 175 __ bind(LoadFloatArg); 176 __ ldf( FloatRegisterImpl::S, a, ldarg.as_float_register(), 4); 177 __ ba(NextArg); 178 __ delayed()->srl( G4_scratch, 2, G4_scratch ); 179 180 __ bind(LoadDoubleArg); 181 __ ldf( FloatRegisterImpl::D, a, ldarg.as_double_register() ); 182 __ ba(NextArg); 183 __ delayed()->srl( G4_scratch, 2, G4_scratch ); 184 185 __ bind(NextArg); 186 187 } 188 189 __ bind(done); 190 __ ret(); 191 __ delayed()-> 192 restore(O0, 0, Lscratch); // caller's Lscratch gets the result handler 193 return entry; 194 } 195 #endif 196 197 void TemplateInterpreterGenerator::generate_counter_overflow(Label& Lcontinue) { 198 199 // Generate code to initiate compilation on the counter overflow. 200 201 // InterpreterRuntime::frequency_counter_overflow takes two arguments, 202 // the first indicates if the counter overflow occurs at a backwards branch (NULL bcp) 203 // and the second is only used when the first is true. We pass zero for both. 204 // The call returns the address of the verified entry point for the method or NULL 205 // if the compilation did not complete (either went background or bailed out). 206 __ set((int)false, O2); 207 __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::frequency_counter_overflow), O2, O2, true); 208 // returns verified_entry_point or NULL 209 // we ignore it in any case 210 __ ba_short(Lcontinue); 211 212 } 213 214 215 // End of helpers 216 217 // Various method entries 218 219 // Abstract method entry 220 // Attempt to execute abstract method. Throw exception 221 // 222 address TemplateInterpreterGenerator::generate_abstract_entry(void) { 223 address entry = __ pc(); 224 // abstract method entry 225 // throw exception 226 __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::throw_AbstractMethodError)); 227 // the call_VM checks for exception, so we should never return here. 228 __ should_not_reach_here(); 229 return entry; 230 231 }