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