interpreter.cpp revision 9248:6ab7e19c9220
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 "asm/macroAssembler.inline.hpp"
28#include "compiler/disassembler.hpp"
29#include "interpreter/bytecodeHistogram.hpp"
30#include "interpreter/bytecodeInterpreter.hpp"
31#include "interpreter/interpreter.hpp"
32#include "interpreter/interpreterGenerator.hpp"
33#include "interpreter/interpreterRuntime.hpp"
34#include "interpreter/interp_masm.hpp"
35#include "interpreter/templateTable.hpp"
36#include "memory/allocation.inline.hpp"
37#include "memory/resourceArea.hpp"
38#include "oops/arrayOop.hpp"
39#include "oops/methodData.hpp"
40#include "oops/method.hpp"
41#include "oops/oop.inline.hpp"
42#include "prims/forte.hpp"
43#include "prims/jvmtiExport.hpp"
44#include "prims/methodHandles.hpp"
45#include "runtime/handles.inline.hpp"
46#include "runtime/sharedRuntime.hpp"
47#include "runtime/stubRoutines.hpp"
48#include "runtime/timer.hpp"
49
50# define __ _masm->
51
52
53//------------------------------------------------------------------------------------------------------------------------
54// Implementation of InterpreterCodelet
55
56void InterpreterCodelet::initialize(const char* description, Bytecodes::Code bytecode) {
57  _description       = description;
58  _bytecode          = bytecode;
59}
60
61
62void InterpreterCodelet::verify() {
63}
64
65
66void InterpreterCodelet::print_on(outputStream* st) const {
67  ttyLocker ttyl;
68
69  if (PrintInterpreter) {
70    st->cr();
71    st->print_cr("----------------------------------------------------------------------");
72  }
73
74  if (description() != NULL) st->print("%s  ", description());
75  if (bytecode()    >= 0   ) st->print("%d %s  ", bytecode(), Bytecodes::name(bytecode()));
76  st->print_cr("[" INTPTR_FORMAT ", " INTPTR_FORMAT "]  %d bytes",
77                p2i(code_begin()), p2i(code_end()), code_size());
78
79  if (PrintInterpreter) {
80    st->cr();
81    Disassembler::decode(code_begin(), code_end(), st, DEBUG_ONLY(_strings) NOT_DEBUG(CodeStrings()));
82  }
83}
84
85CodeletMark::CodeletMark(InterpreterMacroAssembler*& masm,
86                         const char* description,
87                         Bytecodes::Code bytecode) :
88  _clet((InterpreterCodelet*)AbstractInterpreter::code()->request(codelet_size())),
89  _cb(_clet->code_begin(), _clet->code_size()) {
90  // Request all space (add some slack for Codelet data).
91  assert(_clet != NULL, "we checked not enough space already");
92
93  // Initialize Codelet attributes.
94  _clet->initialize(description, bytecode);
95  // Create assembler for code generation.
96  masm = new InterpreterMacroAssembler(&_cb);
97  _masm = &masm;
98}
99
100CodeletMark::~CodeletMark() {
101  // Align so printing shows nop's instead of random code at the end (Codelets are aligned).
102  (*_masm)->align(wordSize);
103  // Make sure all code is in code buffer.
104  (*_masm)->flush();
105
106  // Commit Codelet.
107  int committed_code_size = (*_masm)->code()->pure_insts_size();
108  if (committed_code_size) {
109    AbstractInterpreter::code()->commit(committed_code_size, (*_masm)->code()->strings());
110  }
111  // Make sure nobody can use _masm outside a CodeletMark lifespan.
112  *_masm = NULL;
113}
114
115//------------------------------------------------------------------------------------------------------------------------
116// Implementation of platform independent aspects of Interpreter
117
118void AbstractInterpreter::initialize() {
119  if (_code != NULL) return;
120
121  // make sure 'imported' classes are initialized
122  if (CountBytecodes || TraceBytecodes || StopInterpreterAt) BytecodeCounter::reset();
123  if (PrintBytecodeHistogram)                                BytecodeHistogram::reset();
124  if (PrintBytecodePairHistogram)                            BytecodePairHistogram::reset();
125
126  InvocationCounter::reinitialize(DelayCompilationDuringStartup);
127
128}
129
130void AbstractInterpreter::print() {
131  tty->cr();
132  tty->print_cr("----------------------------------------------------------------------");
133  tty->print_cr("Interpreter");
134  tty->cr();
135  tty->print_cr("code size        = %6dK bytes", (int)_code->used_space()/1024);
136  tty->print_cr("total space      = %6dK bytes", (int)_code->total_space()/1024);
137  tty->print_cr("wasted space     = %6dK bytes", (int)_code->available_space()/1024);
138  tty->cr();
139  tty->print_cr("# of codelets    = %6d"      , _code->number_of_stubs());
140  if (_code->number_of_stubs() != 0) {
141    tty->print_cr("avg codelet size = %6d bytes", _code->used_space() / _code->number_of_stubs());
142    tty->cr();
143  }
144  _code->print();
145  tty->print_cr("----------------------------------------------------------------------");
146  tty->cr();
147}
148
149
150void interpreter_init() {
151  Interpreter::initialize();
152#ifndef PRODUCT
153  if (TraceBytecodes) BytecodeTracer::set_closure(BytecodeTracer::std_closure());
154#endif // PRODUCT
155  // need to hit every safepoint in order to call zapping routine
156  // register the interpreter
157  Forte::register_stub(
158    "Interpreter",
159    AbstractInterpreter::code()->code_start(),
160    AbstractInterpreter::code()->code_end()
161  );
162
163  // notify JVMTI profiler
164  if (JvmtiExport::should_post_dynamic_code_generated()) {
165    JvmtiExport::post_dynamic_code_generated("Interpreter",
166                                             AbstractInterpreter::code()->code_start(),
167                                             AbstractInterpreter::code()->code_end());
168  }
169}
170
171//------------------------------------------------------------------------------------------------------------------------
172// Implementation of interpreter
173
174StubQueue* AbstractInterpreter::_code                                       = NULL;
175bool       AbstractInterpreter::_notice_safepoints                          = false;
176address    AbstractInterpreter::_rethrow_exception_entry                    = NULL;
177
178address    AbstractInterpreter::_native_entry_begin                         = NULL;
179address    AbstractInterpreter::_native_entry_end                           = NULL;
180address    AbstractInterpreter::_slow_signature_handler;
181address    AbstractInterpreter::_entry_table            [AbstractInterpreter::number_of_method_entries];
182address    AbstractInterpreter::_native_abi_to_tosca    [AbstractInterpreter::number_of_result_handlers];
183
184//------------------------------------------------------------------------------------------------------------------------
185// Generation of complete interpreter
186
187AbstractInterpreterGenerator::AbstractInterpreterGenerator(StubQueue* _code) {
188  _masm                      = NULL;
189}
190
191
192static const BasicType types[Interpreter::number_of_result_handlers] = {
193  T_BOOLEAN,
194  T_CHAR   ,
195  T_BYTE   ,
196  T_SHORT  ,
197  T_INT    ,
198  T_LONG   ,
199  T_VOID   ,
200  T_FLOAT  ,
201  T_DOUBLE ,
202  T_OBJECT
203};
204
205void AbstractInterpreterGenerator::generate_all() {
206
207
208  { CodeletMark cm(_masm, "slow signature handler");
209    Interpreter::_slow_signature_handler = generate_slow_signature_handler();
210  }
211
212}
213
214//------------------------------------------------------------------------------------------------------------------------
215// Entry points
216
217AbstractInterpreter::MethodKind AbstractInterpreter::method_kind(methodHandle m) {
218  // Abstract method?
219  if (m->is_abstract()) return abstract;
220
221  // Method handle primitive?
222  if (m->is_method_handle_intrinsic()) {
223    vmIntrinsics::ID id = m->intrinsic_id();
224    assert(MethodHandles::is_signature_polymorphic(id), "must match an intrinsic");
225    MethodKind kind = (MethodKind)( method_handle_invoke_FIRST +
226                                    ((int)id - vmIntrinsics::FIRST_MH_SIG_POLY) );
227    assert(kind <= method_handle_invoke_LAST, "parallel enum ranges");
228    return kind;
229  }
230
231#ifndef CC_INTERP
232  if (UseCRC32Intrinsics && m->is_native()) {
233    // Use optimized stub code for CRC32 native methods.
234    switch (m->intrinsic_id()) {
235      case vmIntrinsics::_updateCRC32            : return java_util_zip_CRC32_update;
236      case vmIntrinsics::_updateBytesCRC32       : return java_util_zip_CRC32_updateBytes;
237      case vmIntrinsics::_updateByteBufferCRC32  : return java_util_zip_CRC32_updateByteBuffer;
238    }
239  }
240  if (UseCRC32CIntrinsics) {
241    // Use optimized stub code for CRC32C methods.
242    switch (m->intrinsic_id()) {
243      case vmIntrinsics::_updateBytesCRC32C             : return java_util_zip_CRC32C_updateBytes;
244      case vmIntrinsics::_updateDirectByteBufferCRC32C  : return java_util_zip_CRC32C_updateDirectByteBuffer;
245    }
246  }
247
248  switch(m->intrinsic_id()) {
249  case vmIntrinsics::_intBitsToFloat:      return java_lang_Float_intBitsToFloat;
250  case vmIntrinsics::_floatToRawIntBits:   return java_lang_Float_floatToRawIntBits;
251  case vmIntrinsics::_longBitsToDouble:    return java_lang_Double_longBitsToDouble;
252  case vmIntrinsics::_doubleToRawLongBits: return java_lang_Double_doubleToRawLongBits;
253  }
254
255#endif // CC_INTERP
256
257  // Native method?
258  // Note: This test must come _before_ the test for intrinsic
259  //       methods. See also comments below.
260  if (m->is_native()) {
261    assert(!m->is_method_handle_intrinsic(), "overlapping bits here, watch out");
262    return m->is_synchronized() ? native_synchronized : native;
263  }
264
265  // Synchronized?
266  if (m->is_synchronized()) {
267    return zerolocals_synchronized;
268  }
269
270  if (RegisterFinalizersAtInit && m->code_size() == 1 &&
271      m->intrinsic_id() == vmIntrinsics::_Object_init) {
272    // We need to execute the special return bytecode to check for
273    // finalizer registration so create a normal frame.
274    return zerolocals;
275  }
276
277  // Empty method?
278  if (m->is_empty_method()) {
279    return empty;
280  }
281
282  // Special intrinsic method?
283  // Note: This test must come _after_ the test for native methods,
284  //       otherwise we will run into problems with JDK 1.2, see also
285  //       InterpreterGenerator::generate_method_entry() for
286  //       for details.
287  switch (m->intrinsic_id()) {
288    case vmIntrinsics::_dsin  : return java_lang_math_sin  ;
289    case vmIntrinsics::_dcos  : return java_lang_math_cos  ;
290    case vmIntrinsics::_dtan  : return java_lang_math_tan  ;
291    case vmIntrinsics::_dabs  : return java_lang_math_abs  ;
292    case vmIntrinsics::_dsqrt : return java_lang_math_sqrt ;
293    case vmIntrinsics::_dlog  : return java_lang_math_log  ;
294    case vmIntrinsics::_dlog10: return java_lang_math_log10;
295    case vmIntrinsics::_dpow  : return java_lang_math_pow  ;
296    case vmIntrinsics::_dexp  : return java_lang_math_exp  ;
297
298    case vmIntrinsics::_Reference_get:
299                                return java_lang_ref_reference_get;
300  }
301
302  // Accessor method?
303  if (m->is_accessor()) {
304    assert(m->size_of_parameters() == 1, "fast code for accessors assumes parameter size = 1");
305    return accessor;
306  }
307
308  // Note: for now: zero locals for all non-empty methods
309  return zerolocals;
310}
311
312
313void AbstractInterpreter::set_entry_for_kind(AbstractInterpreter::MethodKind kind, address entry) {
314  assert(kind >= method_handle_invoke_FIRST &&
315         kind <= method_handle_invoke_LAST, "late initialization only for MH entry points");
316  assert(_entry_table[kind] == _entry_table[abstract], "previous value must be AME entry");
317  _entry_table[kind] = entry;
318}
319
320
321// Return true if the interpreter can prove that the given bytecode has
322// not yet been executed (in Java semantics, not in actual operation).
323bool AbstractInterpreter::is_not_reached(const methodHandle& method, int bci) {
324  Bytecodes::Code code = method()->code_at(bci);
325
326  if (!Bytecodes::must_rewrite(code)) {
327    // might have been reached
328    return false;
329  }
330
331  // the bytecode might not be rewritten if the method is an accessor, etc.
332  address ientry = method->interpreter_entry();
333  if (ientry != entry_for_kind(AbstractInterpreter::zerolocals) &&
334      ientry != entry_for_kind(AbstractInterpreter::zerolocals_synchronized))
335    return false;  // interpreter does not run this method!
336
337  // otherwise, we can be sure this bytecode has never been executed
338  return true;
339}
340
341
342#ifndef PRODUCT
343void AbstractInterpreter::print_method_kind(MethodKind kind) {
344  switch (kind) {
345    case zerolocals             : tty->print("zerolocals"             ); break;
346    case zerolocals_synchronized: tty->print("zerolocals_synchronized"); break;
347    case native                 : tty->print("native"                 ); break;
348    case native_synchronized    : tty->print("native_synchronized"    ); break;
349    case empty                  : tty->print("empty"                  ); break;
350    case accessor               : tty->print("accessor"               ); break;
351    case abstract               : tty->print("abstract"               ); break;
352    case java_lang_math_sin     : tty->print("java_lang_math_sin"     ); break;
353    case java_lang_math_cos     : tty->print("java_lang_math_cos"     ); break;
354    case java_lang_math_tan     : tty->print("java_lang_math_tan"     ); break;
355    case java_lang_math_abs     : tty->print("java_lang_math_abs"     ); break;
356    case java_lang_math_sqrt    : tty->print("java_lang_math_sqrt"    ); break;
357    case java_lang_math_log     : tty->print("java_lang_math_log"     ); break;
358    case java_lang_math_log10   : tty->print("java_lang_math_log10"   ); break;
359    case java_util_zip_CRC32_update           : tty->print("java_util_zip_CRC32_update"); break;
360    case java_util_zip_CRC32_updateBytes      : tty->print("java_util_zip_CRC32_updateBytes"); break;
361    case java_util_zip_CRC32_updateByteBuffer : tty->print("java_util_zip_CRC32_updateByteBuffer"); break;
362    case java_util_zip_CRC32C_updateBytes     : tty->print("java_util_zip_CRC32C_updateBytes"); break;
363    case java_util_zip_CRC32C_updateDirectByteBuffer: tty->print("java_util_zip_CRC32C_updateDirectByteByffer"); break;
364    default:
365      if (kind >= method_handle_invoke_FIRST &&
366          kind <= method_handle_invoke_LAST) {
367        const char* kind_name = vmIntrinsics::name_at(method_handle_intrinsic(kind));
368        if (kind_name[0] == '_')  kind_name = &kind_name[1];  // '_invokeExact' => 'invokeExact'
369        tty->print("method_handle_%s", kind_name);
370        break;
371      }
372      ShouldNotReachHere();
373      break;
374  }
375}
376#endif // PRODUCT
377
378
379//------------------------------------------------------------------------------------------------------------------------
380// Deoptimization support
381
382/**
383 * If a deoptimization happens, this function returns the point of next bytecode to continue execution.
384 */
385address AbstractInterpreter::deopt_continue_after_entry(Method* method, address bcp, int callee_parameters, bool is_top_frame) {
386  assert(method->contains(bcp), "just checkin'");
387
388  // Get the original and rewritten bytecode.
389  Bytecodes::Code code = Bytecodes::java_code_at(method, bcp);
390  assert(!Interpreter::bytecode_should_reexecute(code), "should not reexecute");
391
392  const int bci = method->bci_from(bcp);
393
394  // compute continuation length
395  const int length = Bytecodes::length_at(method, bcp);
396
397  // compute result type
398  BasicType type = T_ILLEGAL;
399
400  switch (code) {
401    case Bytecodes::_invokevirtual  :
402    case Bytecodes::_invokespecial  :
403    case Bytecodes::_invokestatic   :
404    case Bytecodes::_invokeinterface: {
405      Thread *thread = Thread::current();
406      ResourceMark rm(thread);
407      methodHandle mh(thread, method);
408      type = Bytecode_invoke(mh, bci).result_type();
409      // since the cache entry might not be initialized:
410      // (NOT needed for the old calling convension)
411      if (!is_top_frame) {
412        int index = Bytes::get_native_u2(bcp+1);
413        method->constants()->cache()->entry_at(index)->set_parameter_size(callee_parameters);
414      }
415      break;
416    }
417
418   case Bytecodes::_invokedynamic: {
419      Thread *thread = Thread::current();
420      ResourceMark rm(thread);
421      methodHandle mh(thread, method);
422      type = Bytecode_invoke(mh, bci).result_type();
423      // since the cache entry might not be initialized:
424      // (NOT needed for the old calling convension)
425      if (!is_top_frame) {
426        int index = Bytes::get_native_u4(bcp+1);
427        method->constants()->invokedynamic_cp_cache_entry_at(index)->set_parameter_size(callee_parameters);
428      }
429      break;
430    }
431
432    case Bytecodes::_ldc   :
433    case Bytecodes::_ldc_w : // fall through
434    case Bytecodes::_ldc2_w:
435      {
436        Thread *thread = Thread::current();
437        ResourceMark rm(thread);
438        methodHandle mh(thread, method);
439        type = Bytecode_loadconstant(mh, bci).result_type();
440        break;
441      }
442
443    default:
444      type = Bytecodes::result_type(code);
445      break;
446  }
447
448  // return entry point for computed continuation state & bytecode length
449  return
450    is_top_frame
451    ? Interpreter::deopt_entry (as_TosState(type), length)
452    : Interpreter::return_entry(as_TosState(type), length, code);
453}
454
455// If deoptimization happens, this function returns the point where the interpreter reexecutes
456// the bytecode.
457// Note: Bytecodes::_athrow is a special case in that it does not return
458//       Interpreter::deopt_entry(vtos, 0) like others
459address AbstractInterpreter::deopt_reexecute_entry(Method* method, address bcp) {
460  assert(method->contains(bcp), "just checkin'");
461  Bytecodes::Code code   = Bytecodes::java_code_at(method, bcp);
462#if defined(COMPILER1) || INCLUDE_JVMCI
463  if(code == Bytecodes::_athrow ) {
464    return Interpreter::rethrow_exception_entry();
465  }
466#endif /* COMPILER1 || INCLUDE_JVMCI */
467  return Interpreter::deopt_entry(vtos, 0);
468}
469
470// If deoptimization happens, the interpreter should reexecute these bytecodes.
471// This function mainly helps the compilers to set up the reexecute bit.
472bool AbstractInterpreter::bytecode_should_reexecute(Bytecodes::Code code) {
473  switch (code) {
474    case Bytecodes::_lookupswitch:
475    case Bytecodes::_tableswitch:
476    case Bytecodes::_fast_binaryswitch:
477    case Bytecodes::_fast_linearswitch:
478    // recompute condtional expression folded into _if<cond>
479    case Bytecodes::_lcmp      :
480    case Bytecodes::_fcmpl     :
481    case Bytecodes::_fcmpg     :
482    case Bytecodes::_dcmpl     :
483    case Bytecodes::_dcmpg     :
484    case Bytecodes::_ifnull    :
485    case Bytecodes::_ifnonnull :
486    case Bytecodes::_goto      :
487    case Bytecodes::_goto_w    :
488    case Bytecodes::_ifeq      :
489    case Bytecodes::_ifne      :
490    case Bytecodes::_iflt      :
491    case Bytecodes::_ifge      :
492    case Bytecodes::_ifgt      :
493    case Bytecodes::_ifle      :
494    case Bytecodes::_if_icmpeq :
495    case Bytecodes::_if_icmpne :
496    case Bytecodes::_if_icmplt :
497    case Bytecodes::_if_icmpge :
498    case Bytecodes::_if_icmpgt :
499    case Bytecodes::_if_icmple :
500    case Bytecodes::_if_acmpeq :
501    case Bytecodes::_if_acmpne :
502    // special cases
503    case Bytecodes::_getfield  :
504    case Bytecodes::_putfield  :
505    case Bytecodes::_getstatic :
506    case Bytecodes::_putstatic :
507    case Bytecodes::_aastore   :
508#ifdef COMPILER1
509    //special case of reexecution
510    case Bytecodes::_athrow    :
511#endif
512      return true;
513
514    default:
515      return false;
516  }
517}
518
519void AbstractInterpreterGenerator::bang_stack_shadow_pages(bool native_call) {
520  // Quick & dirty stack overflow checking: bang the stack & handle trap.
521  // Note that we do the banging after the frame is setup, since the exception
522  // handling code expects to find a valid interpreter frame on the stack.
523  // Doing the banging earlier fails if the caller frame is not an interpreter
524  // frame.
525  // (Also, the exception throwing code expects to unlock any synchronized
526  // method receiever, so do the banging after locking the receiver.)
527
528  // Bang each page in the shadow zone. We can't assume it's been done for
529  // an interpreter frame with greater than a page of locals, so each page
530  // needs to be checked.  Only true for non-native.
531  if (UseStackBanging) {
532    const int start_page = native_call ? StackShadowPages : 1;
533    const int page_size = os::vm_page_size();
534    for (int pages = start_page; pages <= StackShadowPages ; pages++) {
535      __ bang_stack_with_offset(pages*page_size);
536    }
537  }
538}
539
540void AbstractInterpreterGenerator::initialize_method_handle_entries() {
541  // method handle entry kinds are generated later in MethodHandlesAdapterGenerator::generate:
542  for (int i = Interpreter::method_handle_invoke_FIRST; i <= Interpreter::method_handle_invoke_LAST; i++) {
543    Interpreter::MethodKind kind = (Interpreter::MethodKind) i;
544    Interpreter::_entry_table[kind] = Interpreter::_entry_table[Interpreter::abstract];
545  }
546}
547
548// Generate method entries
549address InterpreterGenerator::generate_method_entry(
550                                        AbstractInterpreter::MethodKind kind) {
551  // determine code generation flags
552  bool native = false;
553  bool synchronized = false;
554  address entry_point = NULL;
555
556  switch (kind) {
557  case Interpreter::zerolocals             :                                          break;
558  case Interpreter::zerolocals_synchronized:                synchronized = true;      break;
559  case Interpreter::native                 : native = true;                           break;
560  case Interpreter::native_synchronized    : native = true; synchronized = true;      break;
561  case Interpreter::empty                  : entry_point = generate_empty_entry();    break;
562  case Interpreter::accessor               : entry_point = generate_accessor_entry(); break;
563  case Interpreter::abstract               : entry_point = generate_abstract_entry(); break;
564
565  case Interpreter::java_lang_math_sin     : // fall thru
566  case Interpreter::java_lang_math_cos     : // fall thru
567  case Interpreter::java_lang_math_tan     : // fall thru
568  case Interpreter::java_lang_math_abs     : // fall thru
569  case Interpreter::java_lang_math_log     : // fall thru
570  case Interpreter::java_lang_math_log10   : // fall thru
571  case Interpreter::java_lang_math_sqrt    : // fall thru
572  case Interpreter::java_lang_math_pow     : // fall thru
573  case Interpreter::java_lang_math_exp     : entry_point = generate_math_entry(kind);      break;
574  case Interpreter::java_lang_ref_reference_get
575                                           : entry_point = generate_Reference_get_entry(); break;
576#ifndef CC_INTERP
577  case Interpreter::java_util_zip_CRC32_update
578                                           : native = true; entry_point = generate_CRC32_update_entry();  break;
579  case Interpreter::java_util_zip_CRC32_updateBytes
580                                           : // fall thru
581  case Interpreter::java_util_zip_CRC32_updateByteBuffer
582                                           : native = true; entry_point = generate_CRC32_updateBytes_entry(kind); break;
583  case Interpreter::java_util_zip_CRC32C_updateBytes
584                                           : // fall thru
585  case Interpreter::java_util_zip_CRC32C_updateDirectByteBuffer
586                                           : entry_point = generate_CRC32C_updateBytes_entry(kind); break;
587#if defined(TARGET_ARCH_x86) && !defined(_LP64)
588  // On x86_32 platforms, a special entry is generated for the following four methods.
589  // On other platforms the normal entry is used to enter these methods.
590  case Interpreter::java_lang_Float_intBitsToFloat
591                                           : native = true; entry_point = generate_Float_intBitsToFloat_entry(); break;
592  case Interpreter::java_lang_Float_floatToRawIntBits
593                                           : native = true; entry_point = generate_Float_floatToRawIntBits_entry(); break;
594  case Interpreter::java_lang_Double_longBitsToDouble
595                                           : native = true; entry_point = generate_Double_longBitsToDouble_entry(); break;
596  case Interpreter::java_lang_Double_doubleToRawLongBits
597                                           : native = true; entry_point = generate_Double_doubleToRawLongBits_entry(); break;
598#else
599  case Interpreter::java_lang_Float_intBitsToFloat:
600  case Interpreter::java_lang_Float_floatToRawIntBits:
601  case Interpreter::java_lang_Double_longBitsToDouble:
602  case Interpreter::java_lang_Double_doubleToRawLongBits:
603    native = true;
604    break;
605#endif // defined(TARGET_ARCH_x86) && !defined(_LP64)
606#endif // CC_INTERP
607  default:
608    fatal("unexpected method kind: %d", kind);
609    break;
610  }
611
612  if (entry_point) {
613    return entry_point;
614  }
615
616  // We expect the normal and native entry points to be generated first so we can reuse them.
617  if (native) {
618    entry_point = Interpreter::entry_for_kind(synchronized ? Interpreter::native_synchronized : Interpreter::native);
619    if (entry_point == NULL) {
620      entry_point = generate_native_entry(synchronized);
621    }
622  } else {
623    entry_point = Interpreter::entry_for_kind(synchronized ? Interpreter::zerolocals_synchronized : Interpreter::zerolocals);
624    if (entry_point == NULL) {
625      entry_point = generate_normal_entry(synchronized);
626    }
627  }
628
629  return entry_point;
630}
631