107
108
109 //------------------------------------------------------------------------------------------------------------------------
110 // Entry points
111
112 AbstractInterpreter::MethodKind AbstractInterpreter::method_kind(methodHandle m) {
113 // Abstract method?
114 if (m->is_abstract()) return abstract;
115
116 // Method handle primitive?
117 if (m->is_method_handle_intrinsic()) {
118 vmIntrinsics::ID id = m->intrinsic_id();
119 assert(MethodHandles::is_signature_polymorphic(id), "must match an intrinsic");
120 MethodKind kind = (MethodKind)( method_handle_invoke_FIRST +
121 ((int)id - vmIntrinsics::FIRST_MH_SIG_POLY) );
122 assert(kind <= method_handle_invoke_LAST, "parallel enum ranges");
123 return kind;
124 }
125
126 #ifndef CC_INTERP
127 if (UseCRC32Intrinsics && m->is_native()) {
128 // Use optimized stub code for CRC32 native methods.
129 switch (m->intrinsic_id()) {
130 case vmIntrinsics::_updateCRC32 : return java_util_zip_CRC32_update;
131 case vmIntrinsics::_updateBytesCRC32 : return java_util_zip_CRC32_updateBytes;
132 case vmIntrinsics::_updateByteBufferCRC32 : return java_util_zip_CRC32_updateByteBuffer;
133 }
134 }
135 if (UseCRC32CIntrinsics) {
136 // Use optimized stub code for CRC32C methods.
137 switch (m->intrinsic_id()) {
138 case vmIntrinsics::_updateBytesCRC32C : return java_util_zip_CRC32C_updateBytes;
139 case vmIntrinsics::_updateDirectByteBufferCRC32C : return java_util_zip_CRC32C_updateDirectByteBuffer;
140 }
141 }
142
143 switch(m->intrinsic_id()) {
144 case vmIntrinsics::_intBitsToFloat: return java_lang_Float_intBitsToFloat;
145 case vmIntrinsics::_floatToRawIntBits: return java_lang_Float_floatToRawIntBits;
146 case vmIntrinsics::_longBitsToDouble: return java_lang_Double_longBitsToDouble;
147 case vmIntrinsics::_doubleToRawLongBits: return java_lang_Double_doubleToRawLongBits;
148 }
149
150 #endif // CC_INTERP
151
152 // Native method?
153 // Note: This test must come _before_ the test for intrinsic
154 // methods. See also comments below.
155 if (m->is_native()) {
156 assert(!m->is_method_handle_intrinsic(), "overlapping bits here, watch out");
157 return m->is_synchronized() ? native_synchronized : native;
158 }
159
160 // Synchronized?
161 if (m->is_synchronized()) {
162 return zerolocals_synchronized;
163 }
164
165 if (RegisterFinalizersAtInit && m->code_size() == 1 &&
166 m->intrinsic_id() == vmIntrinsics::_Object_init) {
167 // We need to execute the special return bytecode to check for
168 // finalizer registration so create a normal frame.
169 return zerolocals;
172 // Empty method?
173 if (m->is_empty_method()) {
174 return empty;
175 }
176
177 // Special intrinsic method?
178 // Note: This test must come _after_ the test for native methods,
179 // otherwise we will run into problems with JDK 1.2, see also
180 // TemplateInterpreterGenerator::generate_method_entry() for
181 // for details.
182 switch (m->intrinsic_id()) {
183 case vmIntrinsics::_dsin : return java_lang_math_sin ;
184 case vmIntrinsics::_dcos : return java_lang_math_cos ;
185 case vmIntrinsics::_dtan : return java_lang_math_tan ;
186 case vmIntrinsics::_dabs : return java_lang_math_abs ;
187 case vmIntrinsics::_dsqrt : return java_lang_math_sqrt ;
188 case vmIntrinsics::_dlog : return java_lang_math_log ;
189 case vmIntrinsics::_dlog10: return java_lang_math_log10;
190 case vmIntrinsics::_dpow : return java_lang_math_pow ;
191 case vmIntrinsics::_dexp : return java_lang_math_exp ;
192
193 case vmIntrinsics::_Reference_get:
194 return java_lang_ref_reference_get;
195 }
196
197 if (UseFMA) {
198 switch (m->intrinsic_id()) {
199 case vmIntrinsics::_fmaD: return java_lang_math_fmaD;
200 case vmIntrinsics::_fmaF: return java_lang_math_fmaF;
201 }
202 }
203
204 // Accessor method?
205 if (m->is_getter()) {
206 // TODO: We should have used ::is_accessor above, but fast accessors in Zero expect only getters.
207 // See CppInterpreter::accessor_entry in cppInterpreter_zero.cpp. This should be fixed in Zero,
208 // then the call above updated to ::is_accessor
209 assert(m->size_of_parameters() == 1, "fast code for accessors assumes parameter size = 1");
210 return accessor;
211 }
212
213 // Note: for now: zero locals for all non-empty methods
214 return zerolocals;
215 }
216
217 #if INCLUDE_CDS
218
219 address AbstractInterpreter::get_trampoline_code_buffer(AbstractInterpreter::MethodKind kind) {
220 const size_t trampoline_size = SharedRuntime::trampoline_size();
221 address addr = MetaspaceShared::cds_i2i_entry_code_buffers((size_t)(AbstractInterpreter::number_of_method_entries) * trampoline_size);
|
107
108
109 //------------------------------------------------------------------------------------------------------------------------
110 // Entry points
111
112 AbstractInterpreter::MethodKind AbstractInterpreter::method_kind(methodHandle m) {
113 // Abstract method?
114 if (m->is_abstract()) return abstract;
115
116 // Method handle primitive?
117 if (m->is_method_handle_intrinsic()) {
118 vmIntrinsics::ID id = m->intrinsic_id();
119 assert(MethodHandles::is_signature_polymorphic(id), "must match an intrinsic");
120 MethodKind kind = (MethodKind)( method_handle_invoke_FIRST +
121 ((int)id - vmIntrinsics::FIRST_MH_SIG_POLY) );
122 assert(kind <= method_handle_invoke_LAST, "parallel enum ranges");
123 return kind;
124 }
125
126 #ifndef CC_INTERP
127 switch (m->intrinsic_id()) {
128 // Use optimized stub code for CRC32 native methods.
129 case vmIntrinsics::_updateCRC32 : return java_util_zip_CRC32_update;
130 case vmIntrinsics::_updateBytesCRC32 : return java_util_zip_CRC32_updateBytes;
131 case vmIntrinsics::_updateByteBufferCRC32 : return java_util_zip_CRC32_updateByteBuffer;
132 // Use optimized stub code for CRC32C methods.
133 case vmIntrinsics::_updateBytesCRC32C : return java_util_zip_CRC32C_updateBytes;
134 case vmIntrinsics::_updateDirectByteBufferCRC32C : return java_util_zip_CRC32C_updateDirectByteBuffer;
135 case vmIntrinsics::_intBitsToFloat: return java_lang_Float_intBitsToFloat;
136 case vmIntrinsics::_floatToRawIntBits: return java_lang_Float_floatToRawIntBits;
137 case vmIntrinsics::_longBitsToDouble: return java_lang_Double_longBitsToDouble;
138 case vmIntrinsics::_doubleToRawLongBits: return java_lang_Double_doubleToRawLongBits;
139 }
140 #endif // CC_INTERP
141
142 // Native method?
143 // Note: This test must come _before_ the test for intrinsic
144 // methods. See also comments below.
145 if (m->is_native()) {
146 assert(!m->is_method_handle_intrinsic(), "overlapping bits here, watch out");
147 return m->is_synchronized() ? native_synchronized : native;
148 }
149
150 // Synchronized?
151 if (m->is_synchronized()) {
152 return zerolocals_synchronized;
153 }
154
155 if (RegisterFinalizersAtInit && m->code_size() == 1 &&
156 m->intrinsic_id() == vmIntrinsics::_Object_init) {
157 // We need to execute the special return bytecode to check for
158 // finalizer registration so create a normal frame.
159 return zerolocals;
162 // Empty method?
163 if (m->is_empty_method()) {
164 return empty;
165 }
166
167 // Special intrinsic method?
168 // Note: This test must come _after_ the test for native methods,
169 // otherwise we will run into problems with JDK 1.2, see also
170 // TemplateInterpreterGenerator::generate_method_entry() for
171 // for details.
172 switch (m->intrinsic_id()) {
173 case vmIntrinsics::_dsin : return java_lang_math_sin ;
174 case vmIntrinsics::_dcos : return java_lang_math_cos ;
175 case vmIntrinsics::_dtan : return java_lang_math_tan ;
176 case vmIntrinsics::_dabs : return java_lang_math_abs ;
177 case vmIntrinsics::_dsqrt : return java_lang_math_sqrt ;
178 case vmIntrinsics::_dlog : return java_lang_math_log ;
179 case vmIntrinsics::_dlog10: return java_lang_math_log10;
180 case vmIntrinsics::_dpow : return java_lang_math_pow ;
181 case vmIntrinsics::_dexp : return java_lang_math_exp ;
182 case vmIntrinsics::_fmaD : return java_lang_math_fmaD ;
183 case vmIntrinsics::_fmaF : return java_lang_math_fmaF ;
184
185 case vmIntrinsics::_Reference_get:
186 return java_lang_ref_reference_get;
187 }
188
189 // Accessor method?
190 if (m->is_getter()) {
191 // TODO: We should have used ::is_accessor above, but fast accessors in Zero expect only getters.
192 // See CppInterpreter::accessor_entry in cppInterpreter_zero.cpp. This should be fixed in Zero,
193 // then the call above updated to ::is_accessor
194 assert(m->size_of_parameters() == 1, "fast code for accessors assumes parameter size = 1");
195 return accessor;
196 }
197
198 // Note: for now: zero locals for all non-empty methods
199 return zerolocals;
200 }
201
202 #if INCLUDE_CDS
203
204 address AbstractInterpreter::get_trampoline_code_buffer(AbstractInterpreter::MethodKind kind) {
205 const size_t trampoline_size = SharedRuntime::trampoline_size();
206 address addr = MetaspaceShared::cds_i2i_entry_code_buffers((size_t)(AbstractInterpreter::number_of_method_entries) * trampoline_size);
|