291 bool inline_reference_get(); 292 bool inline_Class_cast(); 293 bool inline_aescrypt_Block(vmIntrinsics::ID id); 294 bool inline_cipherBlockChaining_AESCrypt(vmIntrinsics::ID id); 295 bool inline_counterMode_AESCrypt(vmIntrinsics::ID id); 296 Node* inline_cipherBlockChaining_AESCrypt_predicate(bool decrypting); 297 Node* inline_counterMode_AESCrypt_predicate(); 298 Node* get_key_start_from_aescrypt_object(Node* aescrypt_object); 299 Node* get_original_key_start_from_aescrypt_object(Node* aescrypt_object); 300 bool inline_ghash_processBlocks(); 301 bool inline_base64_encodeBlock(); 302 bool inline_sha_implCompress(vmIntrinsics::ID id); 303 bool inline_digestBase_implCompressMB(int predicate); 304 bool inline_sha_implCompressMB(Node* digestBaseObj, ciInstanceKlass* instklass_SHA, 305 bool long_state, address stubAddr, const char *stubName, 306 Node* src_start, Node* ofs, Node* limit); 307 Node* get_state_from_sha_object(Node *sha_object); 308 Node* get_state_from_sha5_object(Node *sha_object); 309 Node* inline_digestBase_implCompressMB_predicate(int predicate); 310 bool inline_encodeISOArray(); 311 bool inline_updateCRC32(); 312 bool inline_updateBytesCRC32(); 313 bool inline_updateByteBufferCRC32(); 314 Node* get_table_from_crc32c_class(ciInstanceKlass *crc32c_class); 315 bool inline_updateBytesCRC32C(); 316 bool inline_updateDirectByteBufferCRC32C(); 317 bool inline_updateBytesAdler32(); 318 bool inline_updateByteBufferAdler32(); 319 bool inline_multiplyToLen(); 320 bool inline_hasNegatives(); 321 bool inline_squareToLen(); 322 bool inline_mulAdd(); 323 bool inline_montgomeryMultiply(); 324 bool inline_montgomerySquare(); 325 bool inline_vectorizedMismatch(); 326 bool inline_fma(vmIntrinsics::ID id); 327 328 bool inline_profileBoolean(); 329 bool inline_isCompileConstant(); 330 void clear_upper_avx() { 824 case vmIntrinsics::_mulAdd: 825 return inline_mulAdd(); 826 827 case vmIntrinsics::_montgomeryMultiply: 828 return inline_montgomeryMultiply(); 829 case vmIntrinsics::_montgomerySquare: 830 return inline_montgomerySquare(); 831 832 case vmIntrinsics::_vectorizedMismatch: 833 return inline_vectorizedMismatch(); 834 835 case vmIntrinsics::_ghash_processBlocks: 836 return inline_ghash_processBlocks(); 837 case vmIntrinsics::_base64_encodeBlock: 838 return inline_base64_encodeBlock(); 839 840 case vmIntrinsics::_encodeISOArray: 841 case vmIntrinsics::_encodeByteISOArray: 842 return inline_encodeISOArray(); 843 844 case vmIntrinsics::_updateCRC32: 845 return inline_updateCRC32(); 846 case vmIntrinsics::_updateBytesCRC32: 847 return inline_updateBytesCRC32(); 848 case vmIntrinsics::_updateByteBufferCRC32: 849 return inline_updateByteBufferCRC32(); 850 851 case vmIntrinsics::_updateBytesCRC32C: 852 return inline_updateBytesCRC32C(); 853 case vmIntrinsics::_updateDirectByteBufferCRC32C: 854 return inline_updateDirectByteBufferCRC32C(); 855 856 case vmIntrinsics::_updateBytesAdler32: 857 return inline_updateBytesAdler32(); 858 case vmIntrinsics::_updateByteBufferAdler32: 859 return inline_updateByteBufferAdler32(); 860 861 case vmIntrinsics::_profileBoolean: 862 return inline_profileBoolean(); 863 case vmIntrinsics::_isCompileConstant: 5362 * int c = ~ crc; 5363 * b = timesXtoThe32[(b ^ c) & 0xFF]; 5364 * b = b ^ (c >>> 8); 5365 * crc = ~b; 5366 */ 5367 5368 Node* M1 = intcon(-1); 5369 crc = _gvn.transform(new XorINode(crc, M1)); 5370 Node* result = _gvn.transform(new XorINode(crc, b)); 5371 result = _gvn.transform(new AndINode(result, intcon(0xFF))); 5372 5373 Node* base = makecon(TypeRawPtr::make(StubRoutines::crc_table_addr())); 5374 Node* offset = _gvn.transform(new LShiftINode(result, intcon(0x2))); 5375 Node* adr = basic_plus_adr(top(), base, ConvI2X(offset)); 5376 result = make_load(control(), adr, TypeInt::INT, T_INT, MemNode::unordered); 5377 5378 crc = _gvn.transform(new URShiftINode(crc, intcon(8))); 5379 result = _gvn.transform(new XorINode(crc, result)); 5380 result = _gvn.transform(new XorINode(result, M1)); 5381 set_result(result); 5382 return true; 5383 } 5384 5385 /** 5386 * Calculate CRC32 for byte[] array. 5387 * int java.util.zip.CRC32.updateBytes(int crc, byte[] buf, int off, int len) 5388 */ 5389 bool LibraryCallKit::inline_updateBytesCRC32() { 5390 assert(UseCRC32Intrinsics, "need AVX and LCMUL instructions support"); 5391 assert(callee()->signature()->size() == 4, "updateBytes has 4 parameters"); 5392 // no receiver since it is static method 5393 Node* crc = argument(0); // type: int 5394 Node* src = argument(1); // type: oop 5395 Node* offset = argument(2); // type: int 5396 Node* length = argument(3); // type: int 5397 5398 const Type* src_type = src->Value(&_gvn); 5399 const TypeAryPtr* top_src = src_type->isa_aryptr(); 5400 if (top_src == NULL || top_src->klass() == NULL) { 5401 // failed array check | 291 bool inline_reference_get(); 292 bool inline_Class_cast(); 293 bool inline_aescrypt_Block(vmIntrinsics::ID id); 294 bool inline_cipherBlockChaining_AESCrypt(vmIntrinsics::ID id); 295 bool inline_counterMode_AESCrypt(vmIntrinsics::ID id); 296 Node* inline_cipherBlockChaining_AESCrypt_predicate(bool decrypting); 297 Node* inline_counterMode_AESCrypt_predicate(); 298 Node* get_key_start_from_aescrypt_object(Node* aescrypt_object); 299 Node* get_original_key_start_from_aescrypt_object(Node* aescrypt_object); 300 bool inline_ghash_processBlocks(); 301 bool inline_base64_encodeBlock(); 302 bool inline_sha_implCompress(vmIntrinsics::ID id); 303 bool inline_digestBase_implCompressMB(int predicate); 304 bool inline_sha_implCompressMB(Node* digestBaseObj, ciInstanceKlass* instklass_SHA, 305 bool long_state, address stubAddr, const char *stubName, 306 Node* src_start, Node* ofs, Node* limit); 307 Node* get_state_from_sha_object(Node *sha_object); 308 Node* get_state_from_sha5_object(Node *sha_object); 309 Node* inline_digestBase_implCompressMB_predicate(int predicate); 310 bool inline_encodeISOArray(); 311 bool inline_setBit(); 312 bool inline_clrBit(); 313 bool inline_updateCRC32(); 314 bool inline_updateBytesCRC32(); 315 bool inline_updateByteBufferCRC32(); 316 Node* get_table_from_crc32c_class(ciInstanceKlass *crc32c_class); 317 bool inline_updateBytesCRC32C(); 318 bool inline_updateDirectByteBufferCRC32C(); 319 bool inline_updateBytesAdler32(); 320 bool inline_updateByteBufferAdler32(); 321 bool inline_multiplyToLen(); 322 bool inline_hasNegatives(); 323 bool inline_squareToLen(); 324 bool inline_mulAdd(); 325 bool inline_montgomeryMultiply(); 326 bool inline_montgomerySquare(); 327 bool inline_vectorizedMismatch(); 328 bool inline_fma(vmIntrinsics::ID id); 329 330 bool inline_profileBoolean(); 331 bool inline_isCompileConstant(); 332 void clear_upper_avx() { 826 case vmIntrinsics::_mulAdd: 827 return inline_mulAdd(); 828 829 case vmIntrinsics::_montgomeryMultiply: 830 return inline_montgomeryMultiply(); 831 case vmIntrinsics::_montgomerySquare: 832 return inline_montgomerySquare(); 833 834 case vmIntrinsics::_vectorizedMismatch: 835 return inline_vectorizedMismatch(); 836 837 case vmIntrinsics::_ghash_processBlocks: 838 return inline_ghash_processBlocks(); 839 case vmIntrinsics::_base64_encodeBlock: 840 return inline_base64_encodeBlock(); 841 842 case vmIntrinsics::_encodeISOArray: 843 case vmIntrinsics::_encodeByteISOArray: 844 return inline_encodeISOArray(); 845 846 case vmIntrinsics::_setBit: 847 return inline_setBit(); 848 case vmIntrinsics::_clrBit: 849 return inline_clrBit(); 850 851 case vmIntrinsics::_updateCRC32: 852 return inline_updateCRC32(); 853 case vmIntrinsics::_updateBytesCRC32: 854 return inline_updateBytesCRC32(); 855 case vmIntrinsics::_updateByteBufferCRC32: 856 return inline_updateByteBufferCRC32(); 857 858 case vmIntrinsics::_updateBytesCRC32C: 859 return inline_updateBytesCRC32C(); 860 case vmIntrinsics::_updateDirectByteBufferCRC32C: 861 return inline_updateDirectByteBufferCRC32C(); 862 863 case vmIntrinsics::_updateBytesAdler32: 864 return inline_updateBytesAdler32(); 865 case vmIntrinsics::_updateByteBufferAdler32: 866 return inline_updateByteBufferAdler32(); 867 868 case vmIntrinsics::_profileBoolean: 869 return inline_profileBoolean(); 870 case vmIntrinsics::_isCompileConstant: 5369 * int c = ~ crc; 5370 * b = timesXtoThe32[(b ^ c) & 0xFF]; 5371 * b = b ^ (c >>> 8); 5372 * crc = ~b; 5373 */ 5374 5375 Node* M1 = intcon(-1); 5376 crc = _gvn.transform(new XorINode(crc, M1)); 5377 Node* result = _gvn.transform(new XorINode(crc, b)); 5378 result = _gvn.transform(new AndINode(result, intcon(0xFF))); 5379 5380 Node* base = makecon(TypeRawPtr::make(StubRoutines::crc_table_addr())); 5381 Node* offset = _gvn.transform(new LShiftINode(result, intcon(0x2))); 5382 Node* adr = basic_plus_adr(top(), base, ConvI2X(offset)); 5383 result = make_load(control(), adr, TypeInt::INT, T_INT, MemNode::unordered); 5384 5385 crc = _gvn.transform(new URShiftINode(crc, intcon(8))); 5386 result = _gvn.transform(new XorINode(crc, result)); 5387 result = _gvn.transform(new XorINode(result, M1)); 5388 set_result(result); 5389 return true; 5390 } 5391 5392 bool LibraryCallKit::inline_setBit() { 5393 Node* bits = argument(0); // type: oop 5394 Node* index = argument(1); // type: int 5395 5396 Node* hi = _gvn.transform(new RShiftINode(index, intcon(3))); 5397 Node* bit = array_element_address(bits, hi, T_BYTE); 5398 5399 Node* lo = _gvn.transform(new AndINode(index, intcon(7))); 5400 Node* value = _gvn.transform(new LShiftINode(intcon(1), lo)); 5401 5402 store_to_memory(control(), bit, value, T_BYTE, TypeAryPtr::BYTES, MemNode::unordered, 5403 false, false, false, 1); 5404 5405 return true; 5406 } 5407 5408 bool LibraryCallKit::inline_clrBit() { 5409 Node* bits = argument(0); // type: oop 5410 Node* index = argument(1); // type: int 5411 5412 Node* hi = _gvn.transform(new RShiftINode(index, intcon(3))); 5413 Node* bit = array_element_address(bits, hi, T_BYTE); 5414 5415 Node* lo = _gvn.transform(new AndINode(index, intcon(7))); 5416 Node* value = _gvn.transform(new LShiftINode(intcon(1), lo)); 5417 value = _gvn.transform(new XorINode(value, intcon(-1))); 5418 5419 store_to_memory(control(), bit, value, T_BYTE, TypeAryPtr::BYTES, MemNode::unordered, 5420 false, false, false, 0); 5421 5422 return true; 5423 } 5424 5425 /** 5426 * Calculate CRC32 for byte[] array. 5427 * int java.util.zip.CRC32.updateBytes(int crc, byte[] buf, int off, int len) 5428 */ 5429 bool LibraryCallKit::inline_updateBytesCRC32() { 5430 assert(UseCRC32Intrinsics, "need AVX and LCMUL instructions support"); 5431 assert(callee()->signature()->size() == 4, "updateBytes has 4 parameters"); 5432 // no receiver since it is static method 5433 Node* crc = argument(0); // type: int 5434 Node* src = argument(1); // type: oop 5435 Node* offset = argument(2); // type: int 5436 Node* length = argument(3); // type: int 5437 5438 const Type* src_type = src->Value(&_gvn); 5439 const TypeAryPtr* top_src = src_type->isa_aryptr(); 5440 if (top_src == NULL || top_src->klass() == NULL) { 5441 // failed array check |