288 289 typedef enum { LS_get_add, LS_get_set, LS_cmp_swap, LS_cmp_swap_weak, LS_cmp_exchange } LoadStoreKind; 290 bool inline_unsafe_load_store(BasicType type, LoadStoreKind kind, AccessKind access_kind); 291 bool inline_unsafe_fence(vmIntrinsics::ID id); 292 bool inline_onspinwait(); 293 bool inline_fp_conversions(vmIntrinsics::ID id); 294 bool inline_number_methods(vmIntrinsics::ID id); 295 bool inline_reference_get(); 296 bool inline_Class_cast(); 297 bool inline_aescrypt_Block(vmIntrinsics::ID id); 298 bool inline_cipherBlockChaining_AESCrypt(vmIntrinsics::ID id); 299 bool inline_electronicCodeBook_AESCrypt(vmIntrinsics::ID id); 300 bool inline_counterMode_AESCrypt(vmIntrinsics::ID id); 301 Node* inline_cipherBlockChaining_AESCrypt_predicate(bool decrypting); 302 Node* inline_electronicCodeBook_AESCrypt_predicate(bool decrypting); 303 Node* inline_counterMode_AESCrypt_predicate(); 304 Node* get_key_start_from_aescrypt_object(Node* aescrypt_object); 305 Node* get_original_key_start_from_aescrypt_object(Node* aescrypt_object); 306 bool inline_ghash_processBlocks(); 307 bool inline_base64_encodeBlock(); 308 bool inline_digestBase_implCompress(vmIntrinsics::ID id); 309 bool inline_digestBase_implCompressMB(int predicate); 310 bool inline_digestBase_implCompressMB(Node* digestBaseObj, ciInstanceKlass* instklass, 311 bool long_state, address stubAddr, const char *stubName, 312 Node* src_start, Node* ofs, Node* limit); 313 Node* get_state_from_digest_object(Node *digestBase_object); 314 Node* get_long_state_from_digest_object(Node *digestBase_object); 315 Node* inline_digestBase_implCompressMB_predicate(int predicate); 316 bool inline_encodeISOArray(); 317 bool inline_updateCRC32(); 318 bool inline_updateBytesCRC32(); 319 bool inline_updateByteBufferCRC32(); 320 Node* get_table_from_crc32c_class(ciInstanceKlass *crc32c_class); 321 bool inline_updateBytesCRC32C(); 322 bool inline_updateDirectByteBufferCRC32C(); 323 bool inline_updateBytesAdler32(); 324 bool inline_updateByteBufferAdler32(); 325 bool inline_multiplyToLen(); 326 bool inline_hasNegatives(); 327 bool inline_squareToLen(); 328 bool inline_mulAdd(); 844 case vmIntrinsics::_mulAdd: 845 return inline_mulAdd(); 846 847 case vmIntrinsics::_montgomeryMultiply: 848 return inline_montgomeryMultiply(); 849 case vmIntrinsics::_montgomerySquare: 850 return inline_montgomerySquare(); 851 852 case vmIntrinsics::_bigIntegerRightShiftWorker: 853 return inline_bigIntegerShift(true); 854 case vmIntrinsics::_bigIntegerLeftShiftWorker: 855 return inline_bigIntegerShift(false); 856 857 case vmIntrinsics::_vectorizedMismatch: 858 return inline_vectorizedMismatch(); 859 860 case vmIntrinsics::_ghash_processBlocks: 861 return inline_ghash_processBlocks(); 862 case vmIntrinsics::_base64_encodeBlock: 863 return inline_base64_encodeBlock(); 864 865 case vmIntrinsics::_encodeISOArray: 866 case vmIntrinsics::_encodeByteISOArray: 867 return inline_encodeISOArray(); 868 869 case vmIntrinsics::_updateCRC32: 870 return inline_updateCRC32(); 871 case vmIntrinsics::_updateBytesCRC32: 872 return inline_updateBytesCRC32(); 873 case vmIntrinsics::_updateByteBufferCRC32: 874 return inline_updateByteBufferCRC32(); 875 876 case vmIntrinsics::_updateBytesCRC32C: 877 return inline_updateBytesCRC32C(); 878 case vmIntrinsics::_updateDirectByteBufferCRC32C: 879 return inline_updateDirectByteBufferCRC32C(); 880 881 case vmIntrinsics::_updateBytesAdler32: 882 return inline_updateBytesAdler32(); 883 case vmIntrinsics::_updateByteBufferAdler32: 6394 Node* base64obj = argument(0); 6395 Node* src = argument(1); 6396 Node* offset = argument(2); 6397 Node* len = argument(3); 6398 Node* dest = argument(4); 6399 Node* dp = argument(5); 6400 Node* isURL = argument(6); 6401 6402 src = must_be_not_null(src, true); 6403 dest = must_be_not_null(dest, true); 6404 6405 Node* src_start = array_element_address(src, intcon(0), T_BYTE); 6406 assert(src_start, "source array is NULL"); 6407 Node* dest_start = array_element_address(dest, intcon(0), T_BYTE); 6408 assert(dest_start, "destination array is NULL"); 6409 6410 Node* base64 = make_runtime_call(RC_LEAF, 6411 OptoRuntime::base64_encodeBlock_Type(), 6412 stubAddr, stubName, TypePtr::BOTTOM, 6413 src_start, offset, len, dest_start, dp, isURL); 6414 return true; 6415 } 6416 6417 //------------------------------inline_digestBase_implCompress----------------------- 6418 // 6419 // Calculate MD5 for single-block byte[] array. 6420 // void com.sun.security.provider.MD5.implCompress(byte[] buf, int ofs) 6421 // 6422 // Calculate SHA (i.e., SHA-1) for single-block byte[] array. 6423 // void com.sun.security.provider.SHA.implCompress(byte[] buf, int ofs) 6424 // 6425 // Calculate SHA2 (i.e., SHA-244 or SHA-256) for single-block byte[] array. 6426 // void com.sun.security.provider.SHA2.implCompress(byte[] buf, int ofs) 6427 // 6428 // Calculate SHA5 (i.e., SHA-384 or SHA-512) for single-block byte[] array. 6429 // void com.sun.security.provider.SHA5.implCompress(byte[] buf, int ofs) 6430 // 6431 bool LibraryCallKit::inline_digestBase_implCompress(vmIntrinsics::ID id) { 6432 assert(callee()->signature()->size() == 2, "sha_implCompress has 2 parameters"); 6433 | 288 289 typedef enum { LS_get_add, LS_get_set, LS_cmp_swap, LS_cmp_swap_weak, LS_cmp_exchange } LoadStoreKind; 290 bool inline_unsafe_load_store(BasicType type, LoadStoreKind kind, AccessKind access_kind); 291 bool inline_unsafe_fence(vmIntrinsics::ID id); 292 bool inline_onspinwait(); 293 bool inline_fp_conversions(vmIntrinsics::ID id); 294 bool inline_number_methods(vmIntrinsics::ID id); 295 bool inline_reference_get(); 296 bool inline_Class_cast(); 297 bool inline_aescrypt_Block(vmIntrinsics::ID id); 298 bool inline_cipherBlockChaining_AESCrypt(vmIntrinsics::ID id); 299 bool inline_electronicCodeBook_AESCrypt(vmIntrinsics::ID id); 300 bool inline_counterMode_AESCrypt(vmIntrinsics::ID id); 301 Node* inline_cipherBlockChaining_AESCrypt_predicate(bool decrypting); 302 Node* inline_electronicCodeBook_AESCrypt_predicate(bool decrypting); 303 Node* inline_counterMode_AESCrypt_predicate(); 304 Node* get_key_start_from_aescrypt_object(Node* aescrypt_object); 305 Node* get_original_key_start_from_aescrypt_object(Node* aescrypt_object); 306 bool inline_ghash_processBlocks(); 307 bool inline_base64_encodeBlock(); 308 bool inline_base64_decodeBlock(); 309 bool inline_digestBase_implCompress(vmIntrinsics::ID id); 310 bool inline_sha_implCompress(vmIntrinsics::ID id); 311 bool inline_digestBase_implCompressMB(int predicate); 312 bool inline_digestBase_implCompressMB(Node* digestBaseObj, ciInstanceKlass* instklass, 313 bool long_state, address stubAddr, const char *stubName, 314 Node* src_start, Node* ofs, Node* limit); 315 Node* get_state_from_digest_object(Node *digestBase_object); 316 Node* get_long_state_from_digest_object(Node *digestBase_object); 317 Node* inline_digestBase_implCompressMB_predicate(int predicate); 318 bool inline_encodeISOArray(); 319 bool inline_updateCRC32(); 320 bool inline_updateBytesCRC32(); 321 bool inline_updateByteBufferCRC32(); 322 Node* get_table_from_crc32c_class(ciInstanceKlass *crc32c_class); 323 bool inline_updateBytesCRC32C(); 324 bool inline_updateDirectByteBufferCRC32C(); 325 bool inline_updateBytesAdler32(); 326 bool inline_updateByteBufferAdler32(); 327 bool inline_multiplyToLen(); 328 bool inline_hasNegatives(); 329 bool inline_squareToLen(); 330 bool inline_mulAdd(); 846 case vmIntrinsics::_mulAdd: 847 return inline_mulAdd(); 848 849 case vmIntrinsics::_montgomeryMultiply: 850 return inline_montgomeryMultiply(); 851 case vmIntrinsics::_montgomerySquare: 852 return inline_montgomerySquare(); 853 854 case vmIntrinsics::_bigIntegerRightShiftWorker: 855 return inline_bigIntegerShift(true); 856 case vmIntrinsics::_bigIntegerLeftShiftWorker: 857 return inline_bigIntegerShift(false); 858 859 case vmIntrinsics::_vectorizedMismatch: 860 return inline_vectorizedMismatch(); 861 862 case vmIntrinsics::_ghash_processBlocks: 863 return inline_ghash_processBlocks(); 864 case vmIntrinsics::_base64_encodeBlock: 865 return inline_base64_encodeBlock(); 866 case vmIntrinsics::_base64_decodeBlock: 867 return inline_base64_decodeBlock(); 868 869 case vmIntrinsics::_encodeISOArray: 870 case vmIntrinsics::_encodeByteISOArray: 871 return inline_encodeISOArray(); 872 873 case vmIntrinsics::_updateCRC32: 874 return inline_updateCRC32(); 875 case vmIntrinsics::_updateBytesCRC32: 876 return inline_updateBytesCRC32(); 877 case vmIntrinsics::_updateByteBufferCRC32: 878 return inline_updateByteBufferCRC32(); 879 880 case vmIntrinsics::_updateBytesCRC32C: 881 return inline_updateBytesCRC32C(); 882 case vmIntrinsics::_updateDirectByteBufferCRC32C: 883 return inline_updateDirectByteBufferCRC32C(); 884 885 case vmIntrinsics::_updateBytesAdler32: 886 return inline_updateBytesAdler32(); 887 case vmIntrinsics::_updateByteBufferAdler32: 6398 Node* base64obj = argument(0); 6399 Node* src = argument(1); 6400 Node* offset = argument(2); 6401 Node* len = argument(3); 6402 Node* dest = argument(4); 6403 Node* dp = argument(5); 6404 Node* isURL = argument(6); 6405 6406 src = must_be_not_null(src, true); 6407 dest = must_be_not_null(dest, true); 6408 6409 Node* src_start = array_element_address(src, intcon(0), T_BYTE); 6410 assert(src_start, "source array is NULL"); 6411 Node* dest_start = array_element_address(dest, intcon(0), T_BYTE); 6412 assert(dest_start, "destination array is NULL"); 6413 6414 Node* base64 = make_runtime_call(RC_LEAF, 6415 OptoRuntime::base64_encodeBlock_Type(), 6416 stubAddr, stubName, TypePtr::BOTTOM, 6417 src_start, offset, len, dest_start, dp, isURL); 6418 return true; 6419 } 6420 6421 bool LibraryCallKit::inline_base64_decodeBlock() { 6422 address stubAddr; 6423 const char *stubName; 6424 assert(UseBASE64Intrinsics, "need Base64 intrinsics support"); 6425 assert(callee()->signature()->size() == 5, "base64_decodeBlock has 5 parameters"); 6426 stubAddr = StubRoutines::base64_decodeBlock(); 6427 stubName = "decodeBlock"; 6428 6429 if (!stubAddr) return false; 6430 Node* base64obj = argument(0); 6431 Node* src = argument(1); 6432 Node* offset = argument(2); 6433 Node* len = argument(3); 6434 Node* dest = argument(4); 6435 Node* isURL = argument(5); 6436 6437 src = must_be_not_null(src, true); 6438 dest = must_be_not_null(dest, true); 6439 6440 Node* src_start = array_element_address(src, intcon(0), T_BYTE); 6441 assert(src_start, "source array is NULL"); 6442 Node* dest_start = array_element_address(dest, intcon(0), T_BYTE); 6443 assert(dest_start, "destination array is NULL"); 6444 6445 Node* call = make_runtime_call(RC_LEAF, 6446 OptoRuntime::base64_decodeBlock_Type(), 6447 stubAddr, stubName, TypePtr::BOTTOM, 6448 src_start, offset, len, dest_start, isURL); 6449 Node* result = _gvn.transform(new ProjNode(call, TypeFunc::Parms)); 6450 set_result(result); 6451 return true; 6452 } 6453 6454 //------------------------------inline_digestBase_implCompress----------------------- 6455 // 6456 // Calculate MD5 for single-block byte[] array. 6457 // void com.sun.security.provider.MD5.implCompress(byte[] buf, int ofs) 6458 // 6459 // Calculate SHA (i.e., SHA-1) for single-block byte[] array. 6460 // void com.sun.security.provider.SHA.implCompress(byte[] buf, int ofs) 6461 // 6462 // Calculate SHA2 (i.e., SHA-244 or SHA-256) for single-block byte[] array. 6463 // void com.sun.security.provider.SHA2.implCompress(byte[] buf, int ofs) 6464 // 6465 // Calculate SHA5 (i.e., SHA-384 or SHA-512) for single-block byte[] array. 6466 // void com.sun.security.provider.SHA5.implCompress(byte[] buf, int ofs) 6467 // 6468 bool LibraryCallKit::inline_digestBase_implCompress(vmIntrinsics::ID id) { 6469 assert(callee()->signature()->size() == 2, "sha_implCompress has 2 parameters"); 6470 |