src/share/vm/opto/library_call.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File 8076112 Sdiff src/share/vm/opto

src/share/vm/opto/library_call.cpp

Print this page




 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 ||


src/share/vm/opto/library_call.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File