52 public:
53 private:
54 bool _is_virtual;
55 bool _is_predicted;
56 bool _does_virtual_dispatch;
57 vmIntrinsics::ID _intrinsic_id;
58
59 public:
60 LibraryIntrinsic(ciMethod* m, bool is_virtual, bool is_predicted, bool does_virtual_dispatch, vmIntrinsics::ID id)
61 : InlineCallGenerator(m),
62 _is_virtual(is_virtual),
63 _is_predicted(is_predicted),
64 _does_virtual_dispatch(does_virtual_dispatch),
65 _intrinsic_id(id)
66 {
67 }
68 virtual bool is_intrinsic() const { return true; }
69 virtual bool is_virtual() const { return _is_virtual; }
70 virtual bool is_predicted() const { return _is_predicted; }
71 virtual bool does_virtual_dispatch() const { return _does_virtual_dispatch; }
72 virtual JVMState* generate(JVMState* jvms, Parse* parent_parser);
73 virtual Node* generate_predicate(JVMState* jvms);
74 vmIntrinsics::ID intrinsic_id() const { return _intrinsic_id; }
75 };
76
77
78 // Local helper class for LibraryIntrinsic:
79 class LibraryCallKit : public GraphKit {
80 private:
81 LibraryIntrinsic* _intrinsic; // the library intrinsic being called
82 Node* _result; // the result node, if any
83 int _reexecute_sp; // the stack pointer when bytecode needs to be reexecuted
84
85 const TypeOopPtr* sharpen_unsafe_type(Compile::AliasType* alias_type, const TypePtr *adr_type, bool is_native_ptr = false);
86
87 public:
88 LibraryCallKit(JVMState* jvms, LibraryIntrinsic* intrinsic)
89 : GraphKit(jvms),
90 _intrinsic(intrinsic),
91 _result(NULL)
92 {
575 if (m->holder()->name() == ciSymbol::java_lang_Math() ||
576 m->holder()->name() == ciSymbol::java_lang_Float() ||
577 m->holder()->name() == ciSymbol::java_lang_Double()) {
578 if (!InlineMathNatives) return NULL;
579 }
580
581 // -XX:-InlineUnsafeOps disables natives from the Unsafe class.
582 if (m->holder()->name() == ciSymbol::sun_misc_Unsafe()) {
583 if (!InlineUnsafeOps) return NULL;
584 }
585
586 return new LibraryIntrinsic(m, is_virtual, is_predicted, does_virtual_dispatch, (vmIntrinsics::ID) id);
587 }
588
589 //----------------------register_library_intrinsics-----------------------
590 // Initialize this file's data structures, for each Compile instance.
591 void Compile::register_library_intrinsics() {
592 // Nothing to do here.
593 }
594
595 JVMState* LibraryIntrinsic::generate(JVMState* jvms, Parse* parent_parser) {
596 LibraryCallKit kit(jvms, this);
597 Compile* C = kit.C;
598 int nodes = C->unique();
599 #ifndef PRODUCT
600 if ((C->print_intrinsics() || C->print_inlining()) && Verbose) {
601 char buf[1000];
602 const char* str = vmIntrinsics::short_name_as_C_string(intrinsic_id(), buf, sizeof(buf));
603 tty->print_cr("Intrinsic %s", str);
604 }
605 #endif
606 ciMethod* callee = kit.callee();
607 const int bci = kit.bci();
608
609 // Try to inline the intrinsic.
610 if (kit.try_to_inline()) {
611 if (C->print_intrinsics() || C->print_inlining()) {
612 C->print_inlining(callee, jvms->depth() - 1, bci, is_virtual() ? "(intrinsic, virtual)" : "(intrinsic)");
613 }
614 C->gather_intrinsic_statistics(intrinsic_id(), is_virtual(), Compile::_intrinsic_worked);
615 if (C->log()) {
|
52 public:
53 private:
54 bool _is_virtual;
55 bool _is_predicted;
56 bool _does_virtual_dispatch;
57 vmIntrinsics::ID _intrinsic_id;
58
59 public:
60 LibraryIntrinsic(ciMethod* m, bool is_virtual, bool is_predicted, bool does_virtual_dispatch, vmIntrinsics::ID id)
61 : InlineCallGenerator(m),
62 _is_virtual(is_virtual),
63 _is_predicted(is_predicted),
64 _does_virtual_dispatch(does_virtual_dispatch),
65 _intrinsic_id(id)
66 {
67 }
68 virtual bool is_intrinsic() const { return true; }
69 virtual bool is_virtual() const { return _is_virtual; }
70 virtual bool is_predicted() const { return _is_predicted; }
71 virtual bool does_virtual_dispatch() const { return _does_virtual_dispatch; }
72 virtual JVMState* generate(JVMState* jvms);
73 virtual Node* generate_predicate(JVMState* jvms);
74 vmIntrinsics::ID intrinsic_id() const { return _intrinsic_id; }
75 };
76
77
78 // Local helper class for LibraryIntrinsic:
79 class LibraryCallKit : public GraphKit {
80 private:
81 LibraryIntrinsic* _intrinsic; // the library intrinsic being called
82 Node* _result; // the result node, if any
83 int _reexecute_sp; // the stack pointer when bytecode needs to be reexecuted
84
85 const TypeOopPtr* sharpen_unsafe_type(Compile::AliasType* alias_type, const TypePtr *adr_type, bool is_native_ptr = false);
86
87 public:
88 LibraryCallKit(JVMState* jvms, LibraryIntrinsic* intrinsic)
89 : GraphKit(jvms),
90 _intrinsic(intrinsic),
91 _result(NULL)
92 {
575 if (m->holder()->name() == ciSymbol::java_lang_Math() ||
576 m->holder()->name() == ciSymbol::java_lang_Float() ||
577 m->holder()->name() == ciSymbol::java_lang_Double()) {
578 if (!InlineMathNatives) return NULL;
579 }
580
581 // -XX:-InlineUnsafeOps disables natives from the Unsafe class.
582 if (m->holder()->name() == ciSymbol::sun_misc_Unsafe()) {
583 if (!InlineUnsafeOps) return NULL;
584 }
585
586 return new LibraryIntrinsic(m, is_virtual, is_predicted, does_virtual_dispatch, (vmIntrinsics::ID) id);
587 }
588
589 //----------------------register_library_intrinsics-----------------------
590 // Initialize this file's data structures, for each Compile instance.
591 void Compile::register_library_intrinsics() {
592 // Nothing to do here.
593 }
594
595 JVMState* LibraryIntrinsic::generate(JVMState* jvms) {
596 LibraryCallKit kit(jvms, this);
597 Compile* C = kit.C;
598 int nodes = C->unique();
599 #ifndef PRODUCT
600 if ((C->print_intrinsics() || C->print_inlining()) && Verbose) {
601 char buf[1000];
602 const char* str = vmIntrinsics::short_name_as_C_string(intrinsic_id(), buf, sizeof(buf));
603 tty->print_cr("Intrinsic %s", str);
604 }
605 #endif
606 ciMethod* callee = kit.callee();
607 const int bci = kit.bci();
608
609 // Try to inline the intrinsic.
610 if (kit.try_to_inline()) {
611 if (C->print_intrinsics() || C->print_inlining()) {
612 C->print_inlining(callee, jvms->depth() - 1, bci, is_virtual() ? "(intrinsic, virtual)" : "(intrinsic)");
613 }
614 C->gather_intrinsic_statistics(intrinsic_id(), is_virtual(), Compile::_intrinsic_worked);
615 if (C->log()) {
|