< prev index next >

src/share/vm/opto/library_call.cpp

Print this page




 257   bool inline_native_hashcode(bool is_virtual, bool is_static);
 258   bool inline_native_getClass();
 259 
 260   // Helper functions for inlining arraycopy
 261   bool inline_arraycopy();
 262   AllocateArrayNode* tightly_coupled_allocation(Node* ptr,
 263                                                 RegionNode* slow_region);
 264   typedef enum { LS_xadd, LS_xchg, LS_cmpxchg } LoadStoreKind;
 265   bool inline_unsafe_load_store(BasicType type,  LoadStoreKind kind);
 266   bool inline_unsafe_ordered_store(BasicType type);
 267   bool inline_unsafe_fence(vmIntrinsics::ID id);
 268   bool inline_fp_conversions(vmIntrinsics::ID id);
 269   bool inline_number_methods(vmIntrinsics::ID id);
 270   bool inline_reference_get();
 271   bool inline_Class_cast();
 272   bool inline_aescrypt_Block(vmIntrinsics::ID id);
 273   bool inline_cipherBlockChaining_AESCrypt(vmIntrinsics::ID id);
 274   Node* inline_cipherBlockChaining_AESCrypt_predicate(bool decrypting);
 275   Node* get_key_start_from_aescrypt_object(Node* aescrypt_object);
 276   Node* get_original_key_start_from_aescrypt_object(Node* aescrypt_object);


 277   bool inline_sha_implCompress(vmIntrinsics::ID id);
 278   bool inline_digestBase_implCompressMB(int predicate);
 279   bool inline_sha_implCompressMB(Node* digestBaseObj, ciInstanceKlass* instklass_SHA,
 280                                  bool long_state, address stubAddr, const char *stubName,
 281                                  Node* src_start, Node* ofs, Node* limit);
 282   Node* get_state_from_sha_object(Node *sha_object);
 283   Node* get_state_from_sha5_object(Node *sha_object);
 284   Node* inline_digestBase_implCompressMB_predicate(int predicate);
 285   bool inline_encodeISOArray();
 286   bool inline_updateCRC32();
 287   bool inline_updateBytesCRC32();
 288   bool inline_updateByteBufferCRC32();
 289   bool inline_multiplyToLen();
 290 };
 291 
 292 
 293 //---------------------------make_vm_intrinsic----------------------------
 294 CallGenerator* Compile::make_vm_intrinsic(ciMethod* m, bool is_virtual) {
 295   vmIntrinsics::ID id = m->intrinsic_id();
 296   assert(id != vmIntrinsics::_none, "must be a VM intrinsic");


 494     predicates = 1;
 495     break;
 496 
 497   case vmIntrinsics::_sha_implCompress:
 498     if (!UseSHA1Intrinsics) return NULL;
 499     break;
 500 
 501   case vmIntrinsics::_sha2_implCompress:
 502     if (!UseSHA256Intrinsics) return NULL;
 503     break;
 504 
 505   case vmIntrinsics::_sha5_implCompress:
 506     if (!UseSHA512Intrinsics) return NULL;
 507     break;
 508 
 509   case vmIntrinsics::_digestBase_implCompressMB:
 510     if (!(UseSHA1Intrinsics || UseSHA256Intrinsics || UseSHA512Intrinsics)) return NULL;
 511     predicates = 3;
 512     break;
 513 




 514   case vmIntrinsics::_updateCRC32:
 515   case vmIntrinsics::_updateBytesCRC32:
 516   case vmIntrinsics::_updateByteBufferCRC32:
 517     if (!UseCRC32Intrinsics) return NULL;
 518     break;
 519 
 520   case vmIntrinsics::_incrementExactI:
 521   case vmIntrinsics::_addExactI:
 522     if (!Matcher::match_rule_supported(Op_OverflowAddI) || !UseMathExactIntrinsics) return NULL;
 523     break;
 524   case vmIntrinsics::_incrementExactL:
 525   case vmIntrinsics::_addExactL:
 526     if (!Matcher::match_rule_supported(Op_OverflowAddL) || !UseMathExactIntrinsics) return NULL;
 527     break;
 528   case vmIntrinsics::_decrementExactI:
 529   case vmIntrinsics::_subtractExactI:
 530     if (!Matcher::match_rule_supported(Op_OverflowSubI) || !UseMathExactIntrinsics) return NULL;
 531     break;
 532   case vmIntrinsics::_decrementExactL:
 533   case vmIntrinsics::_subtractExactL:


 682   }
 683   C->gather_intrinsic_statistics(intrinsic_id(), is_virtual(), Compile::_intrinsic_failed);
 684   return NULL;
 685 }
 686 
 687 bool LibraryCallKit::try_to_inline(int predicate) {
 688   // Handle symbolic names for otherwise undistinguished boolean switches:
 689   const bool is_store       = true;
 690   const bool is_native_ptr  = true;
 691   const bool is_static      = true;
 692   const bool is_volatile    = true;
 693 
 694   if (!jvms()->has_method()) {
 695     // Root JVMState has a null method.
 696     assert(map()->memory()->Opcode() == Op_Parm, "");
 697     // Insert the memory aliasing node
 698     set_all_memory(reset_memory());
 699   }
 700   assert(merged_memory(), "");
 701 
 702 
 703   switch (intrinsic_id()) {
 704   case vmIntrinsics::_hashCode:                 return inline_native_hashcode(intrinsic()->is_virtual(), !is_static);
 705   case vmIntrinsics::_identityHashCode:         return inline_native_hashcode(/*!virtual*/ false,         is_static);
 706   case vmIntrinsics::_getClass:                 return inline_native_getClass();
 707 
 708   case vmIntrinsics::_dsin:
 709   case vmIntrinsics::_dcos:
 710   case vmIntrinsics::_dtan:
 711   case vmIntrinsics::_dabs:
 712   case vmIntrinsics::_datan2:
 713   case vmIntrinsics::_dsqrt:
 714   case vmIntrinsics::_dexp:
 715   case vmIntrinsics::_dlog:
 716   case vmIntrinsics::_dlog10:
 717   case vmIntrinsics::_dpow:                     return inline_math_native(intrinsic_id());
 718 
 719   case vmIntrinsics::_min:
 720   case vmIntrinsics::_max:                      return inline_min_max(intrinsic_id());
 721 
 722   case vmIntrinsics::_addExactI:                return inline_math_addExactI(false /* add */);


 873   case vmIntrinsics::_Class_cast:               return inline_Class_cast();
 874 
 875   case vmIntrinsics::_aescrypt_encryptBlock:
 876   case vmIntrinsics::_aescrypt_decryptBlock:    return inline_aescrypt_Block(intrinsic_id());
 877 
 878   case vmIntrinsics::_cipherBlockChaining_encryptAESCrypt:
 879   case vmIntrinsics::_cipherBlockChaining_decryptAESCrypt:
 880     return inline_cipherBlockChaining_AESCrypt(intrinsic_id());
 881 
 882   case vmIntrinsics::_sha_implCompress:
 883   case vmIntrinsics::_sha2_implCompress:
 884   case vmIntrinsics::_sha5_implCompress:
 885     return inline_sha_implCompress(intrinsic_id());
 886 
 887   case vmIntrinsics::_digestBase_implCompressMB:
 888     return inline_digestBase_implCompressMB(predicate);
 889 
 890   case vmIntrinsics::_multiplyToLen:
 891     return inline_multiplyToLen();
 892 



 893   case vmIntrinsics::_encodeISOArray:
 894     return inline_encodeISOArray();
 895 
 896   case vmIntrinsics::_updateCRC32:
 897     return inline_updateCRC32();
 898   case vmIntrinsics::_updateBytesCRC32:
 899     return inline_updateBytesCRC32();
 900   case vmIntrinsics::_updateByteBufferCRC32:
 901     return inline_updateByteBufferCRC32();
 902 
 903   default:
 904     // If you get here, it may be that someone has added a new intrinsic
 905     // to the list in vmSymbols.hpp without implementing it here.
 906 #ifndef PRODUCT
 907     if ((PrintMiscellaneous && (Verbose || WizardMode)) || PrintOpto) {
 908       tty->print_cr("*** Warning: Unimplemented intrinsic %s(%d)",
 909                     vmIntrinsics::name_at(intrinsic_id()), intrinsic_id());
 910     }
 911 #endif
 912     return false;


5594   Node* instof_false = generate_guard(bool_instof, NULL, PROB_MIN);
5595 
5596   // for encryption, we are done
5597   if (!decrypting)
5598     return instof_false;  // even if it is NULL
5599 
5600   // for decryption, we need to add a further check to avoid
5601   // taking the intrinsic path when cipher and plain are the same
5602   // see the original java code for why.
5603   RegionNode* region = new RegionNode(3);
5604   region->init_req(1, instof_false);
5605   Node* src = argument(1);
5606   Node* dest = argument(4);
5607   Node* cmp_src_dest = _gvn.transform(new CmpPNode(src, dest));
5608   Node* bool_src_dest = _gvn.transform(new BoolNode(cmp_src_dest, BoolTest::eq));
5609   Node* src_dest_conjoint = generate_guard(bool_src_dest, NULL, PROB_MIN);
5610   region->init_req(2, src_dest_conjoint);
5611 
5612   record_for_igvn(region);
5613   return _gvn.transform(region);







































5614 }
5615 
5616 //------------------------------inline_sha_implCompress-----------------------
5617 //
5618 // Calculate SHA (i.e., SHA-1) for single-block byte[] array.
5619 // void com.sun.security.provider.SHA.implCompress(byte[] buf, int ofs)
5620 //
5621 // Calculate SHA2 (i.e., SHA-244 or SHA-256) for single-block byte[] array.
5622 // void com.sun.security.provider.SHA2.implCompress(byte[] buf, int ofs)
5623 //
5624 // Calculate SHA5 (i.e., SHA-384 or SHA-512) for single-block byte[] array.
5625 // void com.sun.security.provider.SHA5.implCompress(byte[] buf, int ofs)
5626 //
5627 bool LibraryCallKit::inline_sha_implCompress(vmIntrinsics::ID id) {
5628   assert(callee()->signature()->size() == 2, "sha_implCompress has 2 parameters");
5629 
5630   Node* sha_obj = argument(0);
5631   Node* src     = argument(1); // type oop
5632   Node* ofs     = argument(2); // type int
5633 




 257   bool inline_native_hashcode(bool is_virtual, bool is_static);
 258   bool inline_native_getClass();
 259 
 260   // Helper functions for inlining arraycopy
 261   bool inline_arraycopy();
 262   AllocateArrayNode* tightly_coupled_allocation(Node* ptr,
 263                                                 RegionNode* slow_region);
 264   typedef enum { LS_xadd, LS_xchg, LS_cmpxchg } LoadStoreKind;
 265   bool inline_unsafe_load_store(BasicType type,  LoadStoreKind kind);
 266   bool inline_unsafe_ordered_store(BasicType type);
 267   bool inline_unsafe_fence(vmIntrinsics::ID id);
 268   bool inline_fp_conversions(vmIntrinsics::ID id);
 269   bool inline_number_methods(vmIntrinsics::ID id);
 270   bool inline_reference_get();
 271   bool inline_Class_cast();
 272   bool inline_aescrypt_Block(vmIntrinsics::ID id);
 273   bool inline_cipherBlockChaining_AESCrypt(vmIntrinsics::ID id);
 274   Node* inline_cipherBlockChaining_AESCrypt_predicate(bool decrypting);
 275   Node* get_key_start_from_aescrypt_object(Node* aescrypt_object);
 276   Node* get_original_key_start_from_aescrypt_object(Node* aescrypt_object);
 277   bool inline_ghash_processBlocks(vmIntrinsics::ID id);
 278   Node* get_vars_from_ghash_object(Node *ghash_object, const char *var_name);
 279   bool inline_sha_implCompress(vmIntrinsics::ID id);
 280   bool inline_digestBase_implCompressMB(int predicate);
 281   bool inline_sha_implCompressMB(Node* digestBaseObj, ciInstanceKlass* instklass_SHA,
 282                                  bool long_state, address stubAddr, const char *stubName,
 283                                  Node* src_start, Node* ofs, Node* limit);
 284   Node* get_state_from_sha_object(Node *sha_object);
 285   Node* get_state_from_sha5_object(Node *sha_object);
 286   Node* inline_digestBase_implCompressMB_predicate(int predicate);
 287   bool inline_encodeISOArray();
 288   bool inline_updateCRC32();
 289   bool inline_updateBytesCRC32();
 290   bool inline_updateByteBufferCRC32();
 291   bool inline_multiplyToLen();
 292 };
 293 
 294 
 295 //---------------------------make_vm_intrinsic----------------------------
 296 CallGenerator* Compile::make_vm_intrinsic(ciMethod* m, bool is_virtual) {
 297   vmIntrinsics::ID id = m->intrinsic_id();
 298   assert(id != vmIntrinsics::_none, "must be a VM intrinsic");


 496     predicates = 1;
 497     break;
 498 
 499   case vmIntrinsics::_sha_implCompress:
 500     if (!UseSHA1Intrinsics) return NULL;
 501     break;
 502 
 503   case vmIntrinsics::_sha2_implCompress:
 504     if (!UseSHA256Intrinsics) return NULL;
 505     break;
 506 
 507   case vmIntrinsics::_sha5_implCompress:
 508     if (!UseSHA512Intrinsics) return NULL;
 509     break;
 510 
 511   case vmIntrinsics::_digestBase_implCompressMB:
 512     if (!(UseSHA1Intrinsics || UseSHA256Intrinsics || UseSHA512Intrinsics)) return NULL;
 513     predicates = 3;
 514     break;
 515 
 516   case vmIntrinsics::_ghash_processBlocks:
 517     if (!UseGHASHIntrinsics) return NULL;
 518     break;
 519 
 520   case vmIntrinsics::_updateCRC32:
 521   case vmIntrinsics::_updateBytesCRC32:
 522   case vmIntrinsics::_updateByteBufferCRC32:
 523     if (!UseCRC32Intrinsics) return NULL;
 524     break;
 525 
 526   case vmIntrinsics::_incrementExactI:
 527   case vmIntrinsics::_addExactI:
 528     if (!Matcher::match_rule_supported(Op_OverflowAddI) || !UseMathExactIntrinsics) return NULL;
 529     break;
 530   case vmIntrinsics::_incrementExactL:
 531   case vmIntrinsics::_addExactL:
 532     if (!Matcher::match_rule_supported(Op_OverflowAddL) || !UseMathExactIntrinsics) return NULL;
 533     break;
 534   case vmIntrinsics::_decrementExactI:
 535   case vmIntrinsics::_subtractExactI:
 536     if (!Matcher::match_rule_supported(Op_OverflowSubI) || !UseMathExactIntrinsics) return NULL;
 537     break;
 538   case vmIntrinsics::_decrementExactL:
 539   case vmIntrinsics::_subtractExactL:


 688   }
 689   C->gather_intrinsic_statistics(intrinsic_id(), is_virtual(), Compile::_intrinsic_failed);
 690   return NULL;
 691 }
 692 
 693 bool LibraryCallKit::try_to_inline(int predicate) {
 694   // Handle symbolic names for otherwise undistinguished boolean switches:
 695   const bool is_store       = true;
 696   const bool is_native_ptr  = true;
 697   const bool is_static      = true;
 698   const bool is_volatile    = true;
 699 
 700   if (!jvms()->has_method()) {
 701     // Root JVMState has a null method.
 702     assert(map()->memory()->Opcode() == Op_Parm, "");
 703     // Insert the memory aliasing node
 704     set_all_memory(reset_memory());
 705   }
 706   assert(merged_memory(), "");
 707 

 708   switch (intrinsic_id()) {
 709   case vmIntrinsics::_hashCode:                 return inline_native_hashcode(intrinsic()->is_virtual(), !is_static);
 710   case vmIntrinsics::_identityHashCode:         return inline_native_hashcode(/*!virtual*/ false,         is_static);
 711   case vmIntrinsics::_getClass:                 return inline_native_getClass();
 712 
 713   case vmIntrinsics::_dsin:
 714   case vmIntrinsics::_dcos:
 715   case vmIntrinsics::_dtan:
 716   case vmIntrinsics::_dabs:
 717   case vmIntrinsics::_datan2:
 718   case vmIntrinsics::_dsqrt:
 719   case vmIntrinsics::_dexp:
 720   case vmIntrinsics::_dlog:
 721   case vmIntrinsics::_dlog10:
 722   case vmIntrinsics::_dpow:                     return inline_math_native(intrinsic_id());
 723 
 724   case vmIntrinsics::_min:
 725   case vmIntrinsics::_max:                      return inline_min_max(intrinsic_id());
 726 
 727   case vmIntrinsics::_addExactI:                return inline_math_addExactI(false /* add */);


 878   case vmIntrinsics::_Class_cast:               return inline_Class_cast();
 879 
 880   case vmIntrinsics::_aescrypt_encryptBlock:
 881   case vmIntrinsics::_aescrypt_decryptBlock:    return inline_aescrypt_Block(intrinsic_id());
 882 
 883   case vmIntrinsics::_cipherBlockChaining_encryptAESCrypt:
 884   case vmIntrinsics::_cipherBlockChaining_decryptAESCrypt:
 885     return inline_cipherBlockChaining_AESCrypt(intrinsic_id());
 886 
 887   case vmIntrinsics::_sha_implCompress:
 888   case vmIntrinsics::_sha2_implCompress:
 889   case vmIntrinsics::_sha5_implCompress:
 890     return inline_sha_implCompress(intrinsic_id());
 891 
 892   case vmIntrinsics::_digestBase_implCompressMB:
 893     return inline_digestBase_implCompressMB(predicate);
 894 
 895   case vmIntrinsics::_multiplyToLen:
 896     return inline_multiplyToLen();
 897 
 898   case vmIntrinsics::_ghash_processBlocks:
 899     return inline_ghash_processBlocks(intrinsic_id());
 900 
 901   case vmIntrinsics::_encodeISOArray:
 902     return inline_encodeISOArray();
 903 
 904   case vmIntrinsics::_updateCRC32:
 905     return inline_updateCRC32();
 906   case vmIntrinsics::_updateBytesCRC32:
 907     return inline_updateBytesCRC32();
 908   case vmIntrinsics::_updateByteBufferCRC32:
 909     return inline_updateByteBufferCRC32();
 910 
 911   default:
 912     // If you get here, it may be that someone has added a new intrinsic
 913     // to the list in vmSymbols.hpp without implementing it here.
 914 #ifndef PRODUCT
 915     if ((PrintMiscellaneous && (Verbose || WizardMode)) || PrintOpto) {
 916       tty->print_cr("*** Warning: Unimplemented intrinsic %s(%d)",
 917                     vmIntrinsics::name_at(intrinsic_id()), intrinsic_id());
 918     }
 919 #endif
 920     return false;


5602   Node* instof_false = generate_guard(bool_instof, NULL, PROB_MIN);
5603 
5604   // for encryption, we are done
5605   if (!decrypting)
5606     return instof_false;  // even if it is NULL
5607 
5608   // for decryption, we need to add a further check to avoid
5609   // taking the intrinsic path when cipher and plain are the same
5610   // see the original java code for why.
5611   RegionNode* region = new RegionNode(3);
5612   region->init_req(1, instof_false);
5613   Node* src = argument(1);
5614   Node* dest = argument(4);
5615   Node* cmp_src_dest = _gvn.transform(new CmpPNode(src, dest));
5616   Node* bool_src_dest = _gvn.transform(new BoolNode(cmp_src_dest, BoolTest::eq));
5617   Node* src_dest_conjoint = generate_guard(bool_src_dest, NULL, PROB_MIN);
5618   region->init_req(2, src_dest_conjoint);
5619 
5620   record_for_igvn(region);
5621   return _gvn.transform(region);
5622 }
5623 
5624 //------------------------------get_vars_from_ghash_object-----------------------
5625 Node * LibraryCallKit::get_vars_from_ghash_object(Node *ghash_object, const char *var_name) {
5626   Node* ghash_var = load_field_from_object(ghash_object, var_name, "[J", /*is_exact*/ false);
5627   assert (ghash_var != NULL, "wrong version of sun.security.provider.GHASH");
5628   if (ghash_var == NULL) return (Node *) NULL;
5629 
5630   // now have the array, need to get the start address of the array
5631   Node* var = array_element_address(ghash_var, intcon(0), T_LONG);
5632   return var;
5633 }
5634 
5635 //------------------------------inline_ghash_processBlocks
5636 bool LibraryCallKit::inline_ghash_processBlocks(vmIntrinsics::ID id) {
5637   address stubAddr;
5638   const char *stubName;
5639   assert(UseGHASHIntrinsics, "need GHASH intrinsics support");
5640 
5641   stubAddr = StubRoutines::ghash_processBlocks();
5642   stubName = "ghash_processBlocks";
5643 
5644   Node* ghash_object   = argument(0);
5645   Node* data           = argument(1);
5646   Node* offset         = argument(2);
5647   Node* len            = argument(3);
5648 
5649   Node* state_start = get_vars_from_ghash_object(ghash_object, "state");
5650   assert(state_start, "Unable to load GHASH state");
5651   Node* subkeyH_start = get_vars_from_ghash_object(ghash_object, "subkeyH");
5652   assert(subkeyH_start, "Unable to load GHASH subkeyH");
5653   Node* data_start  = array_element_address(data, offset, T_BYTE);
5654   assert(data_start, "data is NULL");
5655 
5656   Node* ghash = make_runtime_call(RC_LEAF|RC_NO_FP,
5657                                   OptoRuntime::ghash_processBlocks_Type(),
5658                                   stubAddr, stubName, TypePtr::BOTTOM,
5659                                   state_start, subkeyH_start, data_start, len);
5660   return true;
5661 }
5662 
5663 //------------------------------inline_sha_implCompress-----------------------
5664 //
5665 // Calculate SHA (i.e., SHA-1) for single-block byte[] array.
5666 // void com.sun.security.provider.SHA.implCompress(byte[] buf, int ofs)
5667 //
5668 // Calculate SHA2 (i.e., SHA-244 or SHA-256) for single-block byte[] array.
5669 // void com.sun.security.provider.SHA2.implCompress(byte[] buf, int ofs)
5670 //
5671 // Calculate SHA5 (i.e., SHA-384 or SHA-512) for single-block byte[] array.
5672 // void com.sun.security.provider.SHA5.implCompress(byte[] buf, int ofs)
5673 //
5674 bool LibraryCallKit::inline_sha_implCompress(vmIntrinsics::ID id) {
5675   assert(callee()->signature()->size() == 2, "sha_implCompress has 2 parameters");
5676 
5677   Node* sha_obj = argument(0);
5678   Node* src     = argument(1); // type oop
5679   Node* ofs     = argument(2); // type int
5680 


< prev index next >