< prev index next >

src/hotspot/share/opto/library_call.cpp

Print this page




 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


< prev index next >