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
|