27 #include "asm/macroAssembler.inline.hpp" |
27 #include "asm/macroAssembler.inline.hpp" |
28 #include "compiler/disassembler.hpp" |
28 #include "compiler/disassembler.hpp" |
29 #include "interpreter/bytecodeHistogram.hpp" |
29 #include "interpreter/bytecodeHistogram.hpp" |
30 #include "interpreter/bytecodeInterpreter.hpp" |
30 #include "interpreter/bytecodeInterpreter.hpp" |
31 #include "interpreter/interpreter.hpp" |
31 #include "interpreter/interpreter.hpp" |
32 #include "interpreter/interpreterGenerator.hpp" |
|
33 #include "interpreter/interpreterRuntime.hpp" |
32 #include "interpreter/interpreterRuntime.hpp" |
34 #include "interpreter/interp_masm.hpp" |
33 #include "interpreter/interp_masm.hpp" |
35 #include "interpreter/templateTable.hpp" |
34 #include "interpreter/templateTable.hpp" |
36 #include "memory/allocation.inline.hpp" |
35 #include "memory/allocation.inline.hpp" |
37 #include "memory/resourceArea.hpp" |
36 #include "memory/resourceArea.hpp" |
280 } |
279 } |
281 |
280 |
282 // Special intrinsic method? |
281 // Special intrinsic method? |
283 // Note: This test must come _after_ the test for native methods, |
282 // Note: This test must come _after_ the test for native methods, |
284 // otherwise we will run into problems with JDK 1.2, see also |
283 // otherwise we will run into problems with JDK 1.2, see also |
285 // InterpreterGenerator::generate_method_entry() for |
284 // TemplateInterpreterGenerator::generate_method_entry() for |
286 // for details. |
285 // for details. |
287 switch (m->intrinsic_id()) { |
286 switch (m->intrinsic_id()) { |
288 case vmIntrinsics::_dsin : return java_lang_math_sin ; |
287 case vmIntrinsics::_dsin : return java_lang_math_sin ; |
289 case vmIntrinsics::_dcos : return java_lang_math_cos ; |
288 case vmIntrinsics::_dcos : return java_lang_math_cos ; |
290 case vmIntrinsics::_dtan : return java_lang_math_tan ; |
289 case vmIntrinsics::_dtan : return java_lang_math_tan ; |
546 for (int i = Interpreter::method_handle_invoke_FIRST; i <= Interpreter::method_handle_invoke_LAST; i++) { |
545 for (int i = Interpreter::method_handle_invoke_FIRST; i <= Interpreter::method_handle_invoke_LAST; i++) { |
547 Interpreter::MethodKind kind = (Interpreter::MethodKind) i; |
546 Interpreter::MethodKind kind = (Interpreter::MethodKind) i; |
548 Interpreter::_entry_table[kind] = Interpreter::_entry_table[Interpreter::abstract]; |
547 Interpreter::_entry_table[kind] = Interpreter::_entry_table[Interpreter::abstract]; |
549 } |
548 } |
550 } |
549 } |
551 |
|
552 // Generate method entries |
|
553 address InterpreterGenerator::generate_method_entry( |
|
554 AbstractInterpreter::MethodKind kind) { |
|
555 // determine code generation flags |
|
556 bool native = false; |
|
557 bool synchronized = false; |
|
558 address entry_point = NULL; |
|
559 |
|
560 switch (kind) { |
|
561 case Interpreter::zerolocals : break; |
|
562 case Interpreter::zerolocals_synchronized: synchronized = true; break; |
|
563 case Interpreter::native : native = true; break; |
|
564 case Interpreter::native_synchronized : native = true; synchronized = true; break; |
|
565 case Interpreter::empty : entry_point = generate_empty_entry(); break; |
|
566 case Interpreter::accessor : entry_point = generate_accessor_entry(); break; |
|
567 case Interpreter::abstract : entry_point = generate_abstract_entry(); break; |
|
568 |
|
569 case Interpreter::java_lang_math_sin : // fall thru |
|
570 case Interpreter::java_lang_math_cos : // fall thru |
|
571 case Interpreter::java_lang_math_tan : // fall thru |
|
572 case Interpreter::java_lang_math_abs : // fall thru |
|
573 case Interpreter::java_lang_math_log : // fall thru |
|
574 case Interpreter::java_lang_math_log10 : // fall thru |
|
575 case Interpreter::java_lang_math_sqrt : // fall thru |
|
576 case Interpreter::java_lang_math_pow : // fall thru |
|
577 case Interpreter::java_lang_math_exp : entry_point = generate_math_entry(kind); break; |
|
578 case Interpreter::java_lang_ref_reference_get |
|
579 : entry_point = generate_Reference_get_entry(); break; |
|
580 #ifndef CC_INTERP |
|
581 case Interpreter::java_util_zip_CRC32_update |
|
582 : native = true; entry_point = generate_CRC32_update_entry(); break; |
|
583 case Interpreter::java_util_zip_CRC32_updateBytes |
|
584 : // fall thru |
|
585 case Interpreter::java_util_zip_CRC32_updateByteBuffer |
|
586 : native = true; entry_point = generate_CRC32_updateBytes_entry(kind); break; |
|
587 case Interpreter::java_util_zip_CRC32C_updateBytes |
|
588 : // fall thru |
|
589 case Interpreter::java_util_zip_CRC32C_updateDirectByteBuffer |
|
590 : entry_point = generate_CRC32C_updateBytes_entry(kind); break; |
|
591 #if defined(TARGET_ARCH_x86) && !defined(_LP64) |
|
592 // On x86_32 platforms, a special entry is generated for the following four methods. |
|
593 // On other platforms the normal entry is used to enter these methods. |
|
594 case Interpreter::java_lang_Float_intBitsToFloat |
|
595 : native = true; entry_point = generate_Float_intBitsToFloat_entry(); break; |
|
596 case Interpreter::java_lang_Float_floatToRawIntBits |
|
597 : native = true; entry_point = generate_Float_floatToRawIntBits_entry(); break; |
|
598 case Interpreter::java_lang_Double_longBitsToDouble |
|
599 : native = true; entry_point = generate_Double_longBitsToDouble_entry(); break; |
|
600 case Interpreter::java_lang_Double_doubleToRawLongBits |
|
601 : native = true; entry_point = generate_Double_doubleToRawLongBits_entry(); break; |
|
602 #else |
|
603 case Interpreter::java_lang_Float_intBitsToFloat: |
|
604 case Interpreter::java_lang_Float_floatToRawIntBits: |
|
605 case Interpreter::java_lang_Double_longBitsToDouble: |
|
606 case Interpreter::java_lang_Double_doubleToRawLongBits: |
|
607 native = true; |
|
608 break; |
|
609 #endif // defined(TARGET_ARCH_x86) && !defined(_LP64) |
|
610 #endif // CC_INTERP |
|
611 default: |
|
612 fatal("unexpected method kind: %d", kind); |
|
613 break; |
|
614 } |
|
615 |
|
616 if (entry_point) { |
|
617 return entry_point; |
|
618 } |
|
619 |
|
620 // We expect the normal and native entry points to be generated first so we can reuse them. |
|
621 if (native) { |
|
622 entry_point = Interpreter::entry_for_kind(synchronized ? Interpreter::native_synchronized : Interpreter::native); |
|
623 if (entry_point == NULL) { |
|
624 entry_point = generate_native_entry(synchronized); |
|
625 } |
|
626 } else { |
|
627 entry_point = Interpreter::entry_for_kind(synchronized ? Interpreter::zerolocals_synchronized : Interpreter::zerolocals); |
|
628 if (entry_point == NULL) { |
|
629 entry_point = generate_normal_entry(synchronized); |
|
630 } |
|
631 } |
|
632 |
|
633 return entry_point; |
|
634 } |
|