288 bool inline_reference_get(); |
288 bool inline_reference_get(); |
289 bool inline_aescrypt_Block(vmIntrinsics::ID id); |
289 bool inline_aescrypt_Block(vmIntrinsics::ID id); |
290 bool inline_cipherBlockChaining_AESCrypt(vmIntrinsics::ID id); |
290 bool inline_cipherBlockChaining_AESCrypt(vmIntrinsics::ID id); |
291 Node* inline_cipherBlockChaining_AESCrypt_predicate(bool decrypting); |
291 Node* inline_cipherBlockChaining_AESCrypt_predicate(bool decrypting); |
292 Node* get_key_start_from_aescrypt_object(Node* aescrypt_object); |
292 Node* get_key_start_from_aescrypt_object(Node* aescrypt_object); |
|
293 bool inline_encodeISOArray(); |
293 }; |
294 }; |
294 |
295 |
295 |
296 |
296 //---------------------------make_vm_intrinsic---------------------------- |
297 //---------------------------make_vm_intrinsic---------------------------- |
297 CallGenerator* Compile::make_vm_intrinsic(ciMethod* m, bool is_virtual) { |
298 CallGenerator* Compile::make_vm_intrinsic(ciMethod* m, bool is_virtual) { |
379 case vmIntrinsics::_copyOfRange: |
380 case vmIntrinsics::_copyOfRange: |
380 if (!InlineObjectCopy) return NULL; |
381 if (!InlineObjectCopy) return NULL; |
381 // These also use the arraycopy intrinsic mechanism: |
382 // These also use the arraycopy intrinsic mechanism: |
382 if (!InlineArrayCopy) return NULL; |
383 if (!InlineArrayCopy) return NULL; |
383 break; |
384 break; |
|
385 case vmIntrinsics::_encodeISOArray: |
|
386 if (!SpecialEncodeISOArray) return NULL; |
|
387 if (!Matcher::match_rule_supported(Op_EncodeISOArray)) return NULL; |
|
388 break; |
384 case vmIntrinsics::_checkIndex: |
389 case vmIntrinsics::_checkIndex: |
385 // We do not intrinsify this. The optimizer does fine with it. |
390 // We do not intrinsify this. The optimizer does fine with it. |
386 return NULL; |
391 return NULL; |
387 |
392 |
388 case vmIntrinsics::_getCallerClass: |
393 case vmIntrinsics::_getCallerClass: |
796 case vmIntrinsics::_aescrypt_decryptBlock: return inline_aescrypt_Block(intrinsic_id()); |
801 case vmIntrinsics::_aescrypt_decryptBlock: return inline_aescrypt_Block(intrinsic_id()); |
797 |
802 |
798 case vmIntrinsics::_cipherBlockChaining_encryptAESCrypt: |
803 case vmIntrinsics::_cipherBlockChaining_encryptAESCrypt: |
799 case vmIntrinsics::_cipherBlockChaining_decryptAESCrypt: |
804 case vmIntrinsics::_cipherBlockChaining_decryptAESCrypt: |
800 return inline_cipherBlockChaining_AESCrypt(intrinsic_id()); |
805 return inline_cipherBlockChaining_AESCrypt(intrinsic_id()); |
|
806 |
|
807 case vmIntrinsics::_encodeISOArray: |
|
808 return inline_encodeISOArray(); |
801 |
809 |
802 default: |
810 default: |
803 // If you get here, it may be that someone has added a new intrinsic |
811 // If you get here, it may be that someone has added a new intrinsic |
804 // to the list in vmSymbols.hpp without implementing it here. |
812 // to the list in vmSymbols.hpp without implementing it here. |
805 #ifndef PRODUCT |
813 #ifndef PRODUCT |
5366 OptoRuntime::fast_arraycopy_Type(), |
5374 OptoRuntime::fast_arraycopy_Type(), |
5367 copyfunc_addr, copyfunc_name, adr_type, |
5375 copyfunc_addr, copyfunc_name, adr_type, |
5368 src_start, dest_start, copy_length XTOP); |
5376 src_start, dest_start, copy_length XTOP); |
5369 } |
5377 } |
5370 |
5378 |
|
5379 //-------------inline_encodeISOArray----------------------------------- |
|
5380 // encode char[] to byte[] in ISO_8859_1 |
|
5381 bool LibraryCallKit::inline_encodeISOArray() { |
|
5382 assert(callee()->signature()->size() == 5, "encodeISOArray has 5 parameters"); |
|
5383 // no receiver since it is static method |
|
5384 Node *src = argument(0); |
|
5385 Node *src_offset = argument(1); |
|
5386 Node *dst = argument(2); |
|
5387 Node *dst_offset = argument(3); |
|
5388 Node *length = argument(4); |
|
5389 |
|
5390 const Type* src_type = src->Value(&_gvn); |
|
5391 const Type* dst_type = dst->Value(&_gvn); |
|
5392 const TypeAryPtr* top_src = src_type->isa_aryptr(); |
|
5393 const TypeAryPtr* top_dest = dst_type->isa_aryptr(); |
|
5394 if (top_src == NULL || top_src->klass() == NULL || |
|
5395 top_dest == NULL || top_dest->klass() == NULL) { |
|
5396 // failed array check |
|
5397 return false; |
|
5398 } |
|
5399 |
|
5400 // Figure out the size and type of the elements we will be copying. |
|
5401 BasicType src_elem = src_type->isa_aryptr()->klass()->as_array_klass()->element_type()->basic_type(); |
|
5402 BasicType dst_elem = dst_type->isa_aryptr()->klass()->as_array_klass()->element_type()->basic_type(); |
|
5403 if (src_elem != T_CHAR || dst_elem != T_BYTE) { |
|
5404 return false; |
|
5405 } |
|
5406 Node* src_start = array_element_address(src, src_offset, src_elem); |
|
5407 Node* dst_start = array_element_address(dst, dst_offset, dst_elem); |
|
5408 // 'src_start' points to src array + scaled offset |
|
5409 // 'dst_start' points to dst array + scaled offset |
|
5410 |
|
5411 const TypeAryPtr* mtype = TypeAryPtr::BYTES; |
|
5412 Node* enc = new (C) EncodeISOArrayNode(control(), memory(mtype), src_start, dst_start, length); |
|
5413 enc = _gvn.transform(enc); |
|
5414 Node* res_mem = _gvn.transform(new (C) SCMemProjNode(enc)); |
|
5415 set_memory(res_mem, mtype); |
|
5416 set_result(enc); |
|
5417 return true; |
|
5418 } |
|
5419 |
5371 //----------------------------inline_reference_get---------------------------- |
5420 //----------------------------inline_reference_get---------------------------- |
5372 // public T java.lang.ref.Reference.get(); |
5421 // public T java.lang.ref.Reference.get(); |
5373 bool LibraryCallKit::inline_reference_get() { |
5422 bool LibraryCallKit::inline_reference_get() { |
5374 const int referent_offset = java_lang_ref_Reference::referent_offset; |
5423 const int referent_offset = java_lang_ref_Reference::referent_offset; |
5375 guarantee(referent_offset > 0, "should have already been set"); |
5424 guarantee(referent_offset > 0, "should have already been set"); |