617 // Initialize this file's data structures, for each Compile instance.
618 void Compile::register_library_intrinsics() {
619 // Nothing to do here.
620 }
621
622 JVMState* LibraryIntrinsic::generate(JVMState* jvms) {
623 LibraryCallKit kit(jvms, this);
624 Compile* C = kit.C;
625 int nodes = C->unique();
626 #ifndef PRODUCT
627 if ((C->print_intrinsics() || C->print_inlining()) && Verbose) {
628 char buf[1000];
629 const char* str = vmIntrinsics::short_name_as_C_string(intrinsic_id(), buf, sizeof(buf));
630 tty->print_cr("Intrinsic %s", str);
631 }
632 #endif
633 ciMethod* callee = kit.callee();
634 const int bci = kit.bci();
635
636 // Try to inline the intrinsic.
637 if (kit.try_to_inline(_last_predicate)) {
638 if (C->print_intrinsics() || C->print_inlining()) {
639 C->print_inlining(callee, jvms->depth() - 1, bci, is_virtual() ? "(intrinsic, virtual)" : "(intrinsic)");
640 }
641 C->gather_intrinsic_statistics(intrinsic_id(), is_virtual(), Compile::_intrinsic_worked);
642 if (C->log()) {
643 C->log()->elem("intrinsic id='%s'%s nodes='%d'",
644 vmIntrinsics::name_at(intrinsic_id()),
645 (is_virtual() ? " virtual='1'" : ""),
646 C->unique() - nodes);
647 }
648 // Push the result from the inlined method onto the stack.
649 kit.push_result();
650 C->print_inlining_update(this);
651 return kit.transfer_exceptions_into_jvms();
652 }
653
654 // The intrinsic bailed out
655 if (C->print_intrinsics() || C->print_inlining()) {
656 if (jvms->has_method()) {
657 // Not a root compile.
658 const char* msg = is_virtual() ? "failed to inline (intrinsic, virtual)" : "failed to inline (intrinsic)";
659 C->print_inlining(callee, jvms->depth() - 1, bci, msg);
660 } else {
661 // Root compile
662 tty->print("Did not generate intrinsic %s%s at bci:%d in",
663 vmIntrinsics::name_at(intrinsic_id()),
664 (is_virtual() ? " (virtual)" : ""), bci);
665 }
666 }
667 C->gather_intrinsic_statistics(intrinsic_id(), is_virtual(), Compile::_intrinsic_failed);
668 C->print_inlining_update(this);
669 return NULL;
670 }
671
672 Node* LibraryIntrinsic::generate_predicate(JVMState* jvms, int predicate) {
673 LibraryCallKit kit(jvms, this);
674 Compile* C = kit.C;
675 int nodes = C->unique();
676 _last_predicate = predicate;
677 #ifndef PRODUCT
678 assert(is_predicated() && predicate < predicates_count(), "sanity");
5214 BasicType dst_elem = dst_type->isa_aryptr()->klass()->as_array_klass()->element_type()->basic_type();
5215 if (src_elem != T_CHAR || dst_elem != T_BYTE) {
5216 return false;
5217 }
5218 Node* src_start = array_element_address(src, src_offset, src_elem);
5219 Node* dst_start = array_element_address(dst, dst_offset, dst_elem);
5220 // 'src_start' points to src array + scaled offset
5221 // 'dst_start' points to dst array + scaled offset
5222
5223 const TypeAryPtr* mtype = TypeAryPtr::BYTES;
5224 Node* enc = new EncodeISOArrayNode(control(), memory(mtype), src_start, dst_start, length);
5225 enc = _gvn.transform(enc);
5226 Node* res_mem = _gvn.transform(new SCMemProjNode(enc));
5227 set_memory(res_mem, mtype);
5228 set_result(enc);
5229 return true;
5230 }
5231
5232 //-------------inline_multiplyToLen-----------------------------------
5233 bool LibraryCallKit::inline_multiplyToLen() {
5234 assert(UseMultiplyToLenIntrinsic, "not implementated on this platform");
5235
5236 address stubAddr = StubRoutines::multiplyToLen();
5237 if (stubAddr == NULL) {
5238 return false; // Intrinsic's stub is not implemented on this platform
5239 }
5240 const char* stubName = "multiplyToLen";
5241
5242 assert(callee()->signature()->size() == 5, "multiplyToLen has 5 parameters");
5243
5244 Node* x = argument(1);
5245 Node* xlen = argument(2);
5246 Node* y = argument(3);
5247 Node* ylen = argument(4);
5248 Node* z = argument(5);
5249
5250 const Type* x_type = x->Value(&_gvn);
5251 const Type* y_type = y->Value(&_gvn);
5252 const TypeAryPtr* top_x = x_type->isa_aryptr();
5253 const TypeAryPtr* top_y = y_type->isa_aryptr();
5254 if (top_x == NULL || top_x->klass() == NULL ||
|
617 // Initialize this file's data structures, for each Compile instance.
618 void Compile::register_library_intrinsics() {
619 // Nothing to do here.
620 }
621
622 JVMState* LibraryIntrinsic::generate(JVMState* jvms) {
623 LibraryCallKit kit(jvms, this);
624 Compile* C = kit.C;
625 int nodes = C->unique();
626 #ifndef PRODUCT
627 if ((C->print_intrinsics() || C->print_inlining()) && Verbose) {
628 char buf[1000];
629 const char* str = vmIntrinsics::short_name_as_C_string(intrinsic_id(), buf, sizeof(buf));
630 tty->print_cr("Intrinsic %s", str);
631 }
632 #endif
633 ciMethod* callee = kit.callee();
634 const int bci = kit.bci();
635
636 // Try to inline the intrinsic.
637 if ((CheckIntrinsics ? callee->intrinsic_candidate() : true) &&
638 kit.try_to_inline(_last_predicate)) {
639 if (C->print_intrinsics() || C->print_inlining()) {
640 C->print_inlining(callee, jvms->depth() - 1, bci, is_virtual() ? "(intrinsic, virtual)" : "(intrinsic)");
641 }
642 C->gather_intrinsic_statistics(intrinsic_id(), is_virtual(), Compile::_intrinsic_worked);
643 if (C->log()) {
644 C->log()->elem("intrinsic id='%s'%s nodes='%d'",
645 vmIntrinsics::name_at(intrinsic_id()),
646 (is_virtual() ? " virtual='1'" : ""),
647 C->unique() - nodes);
648 }
649 // Push the result from the inlined method onto the stack.
650 kit.push_result();
651 C->print_inlining_update(this);
652 return kit.transfer_exceptions_into_jvms();
653 }
654
655 // The intrinsic bailed out
656 if (C->print_intrinsics() || C->print_inlining()) {
657 if (jvms->has_method()) {
658 // Not a root compile.
659 const char* msg;
660 if (callee->intrinsic_candidate()) {
661 msg = is_virtual() ? "failed to inline (intrinsic, virtual)" : "failed to inline (intrinsic)";
662 } else {
663 msg = is_virtual() ? "failed to inline (intrinsic, virtual), method not annotated"
664 : "failed to inline (intrinsic), method not annotated";
665 }
666 C->print_inlining(callee, jvms->depth() - 1, bci, msg);
667 } else {
668 // Root compile
669 tty->print("Did not generate intrinsic %s%s at bci:%d in",
670 vmIntrinsics::name_at(intrinsic_id()),
671 (is_virtual() ? " (virtual)" : ""), bci);
672 }
673 }
674 C->gather_intrinsic_statistics(intrinsic_id(), is_virtual(), Compile::_intrinsic_failed);
675 C->print_inlining_update(this);
676 return NULL;
677 }
678
679 Node* LibraryIntrinsic::generate_predicate(JVMState* jvms, int predicate) {
680 LibraryCallKit kit(jvms, this);
681 Compile* C = kit.C;
682 int nodes = C->unique();
683 _last_predicate = predicate;
684 #ifndef PRODUCT
685 assert(is_predicated() && predicate < predicates_count(), "sanity");
5221 BasicType dst_elem = dst_type->isa_aryptr()->klass()->as_array_klass()->element_type()->basic_type();
5222 if (src_elem != T_CHAR || dst_elem != T_BYTE) {
5223 return false;
5224 }
5225 Node* src_start = array_element_address(src, src_offset, src_elem);
5226 Node* dst_start = array_element_address(dst, dst_offset, dst_elem);
5227 // 'src_start' points to src array + scaled offset
5228 // 'dst_start' points to dst array + scaled offset
5229
5230 const TypeAryPtr* mtype = TypeAryPtr::BYTES;
5231 Node* enc = new EncodeISOArrayNode(control(), memory(mtype), src_start, dst_start, length);
5232 enc = _gvn.transform(enc);
5233 Node* res_mem = _gvn.transform(new SCMemProjNode(enc));
5234 set_memory(res_mem, mtype);
5235 set_result(enc);
5236 return true;
5237 }
5238
5239 //-------------inline_multiplyToLen-----------------------------------
5240 bool LibraryCallKit::inline_multiplyToLen() {
5241 assert(UseMultiplyToLenIntrinsic, "not implemented on this platform");
5242
5243 address stubAddr = StubRoutines::multiplyToLen();
5244 if (stubAddr == NULL) {
5245 return false; // Intrinsic's stub is not implemented on this platform
5246 }
5247 const char* stubName = "multiplyToLen";
5248
5249 assert(callee()->signature()->size() == 5, "multiplyToLen has 5 parameters");
5250
5251 Node* x = argument(1);
5252 Node* xlen = argument(2);
5253 Node* y = argument(3);
5254 Node* ylen = argument(4);
5255 Node* z = argument(5);
5256
5257 const Type* x_type = x->Value(&_gvn);
5258 const Type* y_type = y->Value(&_gvn);
5259 const TypeAryPtr* top_x = x_type->isa_aryptr();
5260 const TypeAryPtr* top_y = y_type->isa_aryptr();
5261 if (top_x == NULL || top_x->klass() == NULL ||
|