525 |
527 |
526 case vmIntrinsics::_multiplyToLen: |
528 case vmIntrinsics::_multiplyToLen: |
527 if (!UseMultiplyToLenIntrinsic) return NULL; |
529 if (!UseMultiplyToLenIntrinsic) return NULL; |
528 break; |
530 break; |
529 |
531 |
|
532 case vmIntrinsics::_squareToLen: |
|
533 if (!UseSquareToLenIntrinsic) return NULL; |
|
534 break; |
|
535 |
|
536 case vmIntrinsics::_mulAdd: |
|
537 if (!UseMulAddIntrinsic) return NULL; |
|
538 break; |
|
539 |
530 case vmIntrinsics::_cipherBlockChaining_encryptAESCrypt: |
540 case vmIntrinsics::_cipherBlockChaining_encryptAESCrypt: |
531 case vmIntrinsics::_cipherBlockChaining_decryptAESCrypt: |
541 case vmIntrinsics::_cipherBlockChaining_decryptAESCrypt: |
532 if (!UseAESIntrinsics) return NULL; |
542 if (!UseAESIntrinsics) return NULL; |
533 // these two require the predicated logic |
543 // these two require the predicated logic |
534 predicates = 1; |
544 predicates = 1; |
924 case vmIntrinsics::_digestBase_implCompressMB: |
934 case vmIntrinsics::_digestBase_implCompressMB: |
925 return inline_digestBase_implCompressMB(predicate); |
935 return inline_digestBase_implCompressMB(predicate); |
926 |
936 |
927 case vmIntrinsics::_multiplyToLen: |
937 case vmIntrinsics::_multiplyToLen: |
928 return inline_multiplyToLen(); |
938 return inline_multiplyToLen(); |
|
939 |
|
940 case vmIntrinsics::_squareToLen: |
|
941 return inline_squareToLen(); |
|
942 |
|
943 case vmIntrinsics::_mulAdd: |
|
944 return inline_mulAdd(); |
929 |
945 |
930 case vmIntrinsics::_encodeISOArray: |
946 case vmIntrinsics::_encodeISOArray: |
931 return inline_encodeISOArray(); |
947 return inline_encodeISOArray(); |
932 |
948 |
933 case vmIntrinsics::_updateCRC32: |
949 case vmIntrinsics::_updateCRC32: |
5854 C->set_has_split_ifs(true); // Has chance for split-if optimization |
5870 C->set_has_split_ifs(true); // Has chance for split-if optimization |
5855 set_result(z); |
5871 set_result(z); |
5856 return true; |
5872 return true; |
5857 } |
5873 } |
5858 |
5874 |
|
5875 //-------------inline_squareToLen------------------------------------ |
|
5876 bool LibraryCallKit::inline_squareToLen() { |
|
5877 assert(UseSquareToLenIntrinsic, "not implementated on this platform"); |
|
5878 |
|
5879 address stubAddr = StubRoutines::squareToLen(); |
|
5880 if (stubAddr == NULL) { |
|
5881 return false; // Intrinsic's stub is not implemented on this platform |
|
5882 } |
|
5883 const char* stubName = "squareToLen"; |
|
5884 |
|
5885 assert(callee()->signature()->size() == 4, "implSquareToLen has 4 parameters"); |
|
5886 |
|
5887 Node* x = argument(0); |
|
5888 Node* len = argument(1); |
|
5889 Node* z = argument(2); |
|
5890 Node* zlen = argument(3); |
|
5891 |
|
5892 const Type* x_type = x->Value(&_gvn); |
|
5893 const Type* z_type = z->Value(&_gvn); |
|
5894 const TypeAryPtr* top_x = x_type->isa_aryptr(); |
|
5895 const TypeAryPtr* top_z = z_type->isa_aryptr(); |
|
5896 if (top_x == NULL || top_x->klass() == NULL || |
|
5897 top_z == NULL || top_z->klass() == NULL) { |
|
5898 // failed array check |
|
5899 return false; |
|
5900 } |
|
5901 |
|
5902 BasicType x_elem = x_type->isa_aryptr()->klass()->as_array_klass()->element_type()->basic_type(); |
|
5903 BasicType z_elem = z_type->isa_aryptr()->klass()->as_array_klass()->element_type()->basic_type(); |
|
5904 if (x_elem != T_INT || z_elem != T_INT) { |
|
5905 return false; |
|
5906 } |
|
5907 |
|
5908 |
|
5909 Node* x_start = array_element_address(x, intcon(0), x_elem); |
|
5910 Node* z_start = array_element_address(z, intcon(0), z_elem); |
|
5911 |
|
5912 Node* call = make_runtime_call(RC_LEAF|RC_NO_FP, |
|
5913 OptoRuntime::squareToLen_Type(), |
|
5914 stubAddr, stubName, TypePtr::BOTTOM, |
|
5915 x_start, len, z_start, zlen); |
|
5916 |
|
5917 set_result(z); |
|
5918 return true; |
|
5919 } |
|
5920 |
|
5921 //-------------inline_mulAdd------------------------------------------ |
|
5922 bool LibraryCallKit::inline_mulAdd() { |
|
5923 assert(UseMulAddIntrinsic, "not implementated on this platform"); |
|
5924 |
|
5925 address stubAddr = StubRoutines::mulAdd(); |
|
5926 if (stubAddr == NULL) { |
|
5927 return false; // Intrinsic's stub is not implemented on this platform |
|
5928 } |
|
5929 const char* stubName = "mulAdd"; |
|
5930 |
|
5931 assert(callee()->signature()->size() == 5, "mulAdd has 5 parameters"); |
|
5932 |
|
5933 Node* out = argument(0); |
|
5934 Node* in = argument(1); |
|
5935 Node* offset = argument(2); |
|
5936 Node* len = argument(3); |
|
5937 Node* k = argument(4); |
|
5938 |
|
5939 const Type* out_type = out->Value(&_gvn); |
|
5940 const Type* in_type = in->Value(&_gvn); |
|
5941 const TypeAryPtr* top_out = out_type->isa_aryptr(); |
|
5942 const TypeAryPtr* top_in = in_type->isa_aryptr(); |
|
5943 if (top_out == NULL || top_out->klass() == NULL || |
|
5944 top_in == NULL || top_in->klass() == NULL) { |
|
5945 // failed array check |
|
5946 return false; |
|
5947 } |
|
5948 |
|
5949 BasicType out_elem = out_type->isa_aryptr()->klass()->as_array_klass()->element_type()->basic_type(); |
|
5950 BasicType in_elem = in_type->isa_aryptr()->klass()->as_array_klass()->element_type()->basic_type(); |
|
5951 if (out_elem != T_INT || in_elem != T_INT) { |
|
5952 return false; |
|
5953 } |
|
5954 |
|
5955 Node* outlen = load_array_length(out); |
|
5956 Node* new_offset = _gvn.transform(new (C) SubINode(outlen, offset)); |
|
5957 Node* out_start = array_element_address(out, intcon(0), out_elem); |
|
5958 Node* in_start = array_element_address(in, intcon(0), in_elem); |
|
5959 |
|
5960 Node* call = make_runtime_call(RC_LEAF|RC_NO_FP, |
|
5961 OptoRuntime::mulAdd_Type(), |
|
5962 stubAddr, stubName, TypePtr::BOTTOM, |
|
5963 out_start,in_start, new_offset, len, k); |
|
5964 Node* result = _gvn.transform(new (C) ProjNode(call, TypeFunc::Parms)); |
|
5965 set_result(result); |
|
5966 return true; |
|
5967 } |
|
5968 |
5859 |
5969 |
5860 /** |
5970 /** |
5861 * Calculate CRC32 for byte. |
5971 * Calculate CRC32 for byte. |
5862 * int java.util.zip.CRC32.update(int crc, int b) |
5972 * int java.util.zip.CRC32.update(int crc, int b) |
5863 */ |
5973 */ |