Mercurial > hg > graal-compiler
comparison src/share/vm/opto/library_call.cpp @ 17799:752ba2e5f6d0
Merge
author | kvn |
---|---|
date | Tue, 25 Feb 2014 15:11:18 -0800 |
parents | 04d32e7fad07 3514ee402842 |
children | 0f19095fd8c1 |
comparison
equal
deleted
inserted
replaced
17798:f040cf9fc9c0 | 17799:752ba2e5f6d0 |
---|---|
302 bool inline_reference_get(); | 302 bool inline_reference_get(); |
303 bool inline_aescrypt_Block(vmIntrinsics::ID id); | 303 bool inline_aescrypt_Block(vmIntrinsics::ID id); |
304 bool inline_cipherBlockChaining_AESCrypt(vmIntrinsics::ID id); | 304 bool inline_cipherBlockChaining_AESCrypt(vmIntrinsics::ID id); |
305 Node* inline_cipherBlockChaining_AESCrypt_predicate(bool decrypting); | 305 Node* inline_cipherBlockChaining_AESCrypt_predicate(bool decrypting); |
306 Node* get_key_start_from_aescrypt_object(Node* aescrypt_object); | 306 Node* get_key_start_from_aescrypt_object(Node* aescrypt_object); |
307 Node* get_original_key_start_from_aescrypt_object(Node* aescrypt_object); | |
307 bool inline_encodeISOArray(); | 308 bool inline_encodeISOArray(); |
308 bool inline_updateCRC32(); | 309 bool inline_updateCRC32(); |
309 bool inline_updateBytesCRC32(); | 310 bool inline_updateBytesCRC32(); |
310 bool inline_updateByteBufferCRC32(); | 311 bool inline_updateByteBufferCRC32(); |
311 }; | 312 }; |
5943 // now need to get the start of its expanded key array | 5944 // now need to get the start of its expanded key array |
5944 // this requires a newer class file that has this array as littleEndian ints, otherwise we revert to java | 5945 // this requires a newer class file that has this array as littleEndian ints, otherwise we revert to java |
5945 Node* k_start = get_key_start_from_aescrypt_object(aescrypt_object); | 5946 Node* k_start = get_key_start_from_aescrypt_object(aescrypt_object); |
5946 if (k_start == NULL) return false; | 5947 if (k_start == NULL) return false; |
5947 | 5948 |
5948 // Call the stub. | 5949 if (Matcher::pass_original_key_for_aes()) { |
5949 make_runtime_call(RC_LEAF|RC_NO_FP, OptoRuntime::aescrypt_block_Type(), | 5950 // on SPARC we need to pass the original key since key expansion needs to happen in intrinsics due to |
5950 stubAddr, stubName, TypePtr::BOTTOM, | 5951 // compatibility issues between Java key expansion and SPARC crypto instructions |
5951 src_start, dest_start, k_start); | 5952 Node* original_k_start = get_original_key_start_from_aescrypt_object(aescrypt_object); |
5953 if (original_k_start == NULL) return false; | |
5954 | |
5955 // Call the stub. | |
5956 make_runtime_call(RC_LEAF|RC_NO_FP, OptoRuntime::aescrypt_block_Type(), | |
5957 stubAddr, stubName, TypePtr::BOTTOM, | |
5958 src_start, dest_start, k_start, original_k_start); | |
5959 } else { | |
5960 // Call the stub. | |
5961 make_runtime_call(RC_LEAF|RC_NO_FP, OptoRuntime::aescrypt_block_Type(), | |
5962 stubAddr, stubName, TypePtr::BOTTOM, | |
5963 src_start, dest_start, k_start); | |
5964 } | |
5952 | 5965 |
5953 return true; | 5966 return true; |
5954 } | 5967 } |
5955 | 5968 |
5956 //------------------------------inline_cipherBlockChaining_AESCrypt----------------------- | 5969 //------------------------------inline_cipherBlockChaining_AESCrypt----------------------- |
6024 // similarly, get the start address of the r vector | 6037 // similarly, get the start address of the r vector |
6025 Node* objRvec = load_field_from_object(cipherBlockChaining_object, "r", "[B", /*is_exact*/ false); | 6038 Node* objRvec = load_field_from_object(cipherBlockChaining_object, "r", "[B", /*is_exact*/ false); |
6026 if (objRvec == NULL) return false; | 6039 if (objRvec == NULL) return false; |
6027 Node* r_start = array_element_address(objRvec, intcon(0), T_BYTE); | 6040 Node* r_start = array_element_address(objRvec, intcon(0), T_BYTE); |
6028 | 6041 |
6029 // Call the stub, passing src_start, dest_start, k_start, r_start and src_len | 6042 Node* cbcCrypt; |
6030 make_runtime_call(RC_LEAF|RC_NO_FP, | 6043 if (Matcher::pass_original_key_for_aes()) { |
6031 OptoRuntime::cipherBlockChaining_aescrypt_Type(), | 6044 // on SPARC we need to pass the original key since key expansion needs to happen in intrinsics due to |
6032 stubAddr, stubName, TypePtr::BOTTOM, | 6045 // compatibility issues between Java key expansion and SPARC crypto instructions |
6033 src_start, dest_start, k_start, r_start, len); | 6046 Node* original_k_start = get_original_key_start_from_aescrypt_object(aescrypt_object); |
6034 | 6047 if (original_k_start == NULL) return false; |
6035 // return is void so no result needs to be pushed | 6048 |
6036 | 6049 // Call the stub, passing src_start, dest_start, k_start, r_start, src_len and original_k_start |
6050 cbcCrypt = make_runtime_call(RC_LEAF|RC_NO_FP, | |
6051 OptoRuntime::cipherBlockChaining_aescrypt_Type(), | |
6052 stubAddr, stubName, TypePtr::BOTTOM, | |
6053 src_start, dest_start, k_start, r_start, len, original_k_start); | |
6054 } else { | |
6055 // Call the stub, passing src_start, dest_start, k_start, r_start and src_len | |
6056 cbcCrypt = make_runtime_call(RC_LEAF|RC_NO_FP, | |
6057 OptoRuntime::cipherBlockChaining_aescrypt_Type(), | |
6058 stubAddr, stubName, TypePtr::BOTTOM, | |
6059 src_start, dest_start, k_start, r_start, len); | |
6060 } | |
6061 | |
6062 // return cipher length (int) | |
6063 Node* retvalue = _gvn.transform(new (C) ProjNode(cbcCrypt, TypeFunc::Parms)); | |
6064 set_result(retvalue); | |
6037 return true; | 6065 return true; |
6038 } | 6066 } |
6039 | 6067 |
6040 //------------------------------get_key_start_from_aescrypt_object----------------------- | 6068 //------------------------------get_key_start_from_aescrypt_object----------------------- |
6041 Node * LibraryCallKit::get_key_start_from_aescrypt_object(Node *aescrypt_object) { | 6069 Node * LibraryCallKit::get_key_start_from_aescrypt_object(Node *aescrypt_object) { |
6044 if (objAESCryptKey == NULL) return (Node *) NULL; | 6072 if (objAESCryptKey == NULL) return (Node *) NULL; |
6045 | 6073 |
6046 // now have the array, need to get the start address of the K array | 6074 // now have the array, need to get the start address of the K array |
6047 Node* k_start = array_element_address(objAESCryptKey, intcon(0), T_INT); | 6075 Node* k_start = array_element_address(objAESCryptKey, intcon(0), T_INT); |
6048 return k_start; | 6076 return k_start; |
6077 } | |
6078 | |
6079 //------------------------------get_original_key_start_from_aescrypt_object----------------------- | |
6080 Node * LibraryCallKit::get_original_key_start_from_aescrypt_object(Node *aescrypt_object) { | |
6081 Node* objAESCryptKey = load_field_from_object(aescrypt_object, "lastKey", "[B", /*is_exact*/ false); | |
6082 assert (objAESCryptKey != NULL, "wrong version of com.sun.crypto.provider.AESCrypt"); | |
6083 if (objAESCryptKey == NULL) return (Node *) NULL; | |
6084 | |
6085 // now have the array, need to get the start address of the lastKey array | |
6086 Node* original_k_start = array_element_address(objAESCryptKey, intcon(0), T_BYTE); | |
6087 return original_k_start; | |
6049 } | 6088 } |
6050 | 6089 |
6051 //----------------------------inline_cipherBlockChaining_AESCrypt_predicate---------------------------- | 6090 //----------------------------inline_cipherBlockChaining_AESCrypt_predicate---------------------------- |
6052 // Return node representing slow path of predicate check. | 6091 // Return node representing slow path of predicate check. |
6053 // the pseudo code we want to emulate with this predicate is: | 6092 // the pseudo code we want to emulate with this predicate is: |