6264
6265 Node* ctrCrypt;
6266 if (Matcher::pass_original_key_for_aes()) {
6267 // no SPARC version for AES/CTR intrinsics now.
6268 return false;
6269 }
6270 // Call the stub, passing src_start, dest_start, k_start, r_start and src_len
6271 ctrCrypt = make_runtime_call(RC_LEAF|RC_NO_FP,
6272 OptoRuntime::counterMode_aescrypt_Type(),
6273 stubAddr, stubName, TypePtr::BOTTOM,
6274 src_start, dest_start, k_start, cnt_start, len, saved_encCounter_start, used);
6275
6276 // return cipher length (int)
6277 Node* retvalue = _gvn.transform(new ProjNode(ctrCrypt, TypeFunc::Parms));
6278 set_result(retvalue);
6279 return true;
6280 }
6281
6282 //------------------------------get_key_start_from_aescrypt_object-----------------------
6283 Node * LibraryCallKit::get_key_start_from_aescrypt_object(Node *aescrypt_object) {
6284 Node* objAESCryptKey = load_field_from_object(aescrypt_object, "K", "[I", /*is_exact*/ false);
6285 assert (objAESCryptKey != NULL, "wrong version of com.sun.crypto.provider.AESCrypt");
6286 if (objAESCryptKey == NULL) return (Node *) NULL;
6287
6288 // now have the array, need to get the start address of the K array
6289 Node* k_start = array_element_address(objAESCryptKey, intcon(0), T_INT);
6290 return k_start;
6291 }
6292
6293 //------------------------------get_original_key_start_from_aescrypt_object-----------------------
6294 Node * LibraryCallKit::get_original_key_start_from_aescrypt_object(Node *aescrypt_object) {
6295 Node* objAESCryptKey = load_field_from_object(aescrypt_object, "lastKey", "[B", /*is_exact*/ false);
6296 assert (objAESCryptKey != NULL, "wrong version of com.sun.crypto.provider.AESCrypt");
6297 if (objAESCryptKey == NULL) return (Node *) NULL;
6298
6299 // now have the array, need to get the start address of the lastKey array
6300 Node* original_k_start = array_element_address(objAESCryptKey, intcon(0), T_BYTE);
6301 return original_k_start;
6302 }
6303
6304 //----------------------------inline_cipherBlockChaining_AESCrypt_predicate----------------------------
|
6264
6265 Node* ctrCrypt;
6266 if (Matcher::pass_original_key_for_aes()) {
6267 // no SPARC version for AES/CTR intrinsics now.
6268 return false;
6269 }
6270 // Call the stub, passing src_start, dest_start, k_start, r_start and src_len
6271 ctrCrypt = make_runtime_call(RC_LEAF|RC_NO_FP,
6272 OptoRuntime::counterMode_aescrypt_Type(),
6273 stubAddr, stubName, TypePtr::BOTTOM,
6274 src_start, dest_start, k_start, cnt_start, len, saved_encCounter_start, used);
6275
6276 // return cipher length (int)
6277 Node* retvalue = _gvn.transform(new ProjNode(ctrCrypt, TypeFunc::Parms));
6278 set_result(retvalue);
6279 return true;
6280 }
6281
6282 //------------------------------get_key_start_from_aescrypt_object-----------------------
6283 Node * LibraryCallKit::get_key_start_from_aescrypt_object(Node *aescrypt_object) {
6284 #ifdef PPC64
6285 // MixColumns for decryption can be reduced by preprocessing MixColumns with round keys.
6286 // Intel's extention is based on this optimization and AESCrypt generates round keys by preprocessing MixColumns.
6287 // However, ppc64 vncipher processes MixColumns and requires the same round keys with encryption.
6288 // The ppc64 stubs of encryption and decryption use the same round keys (sessionK[0]).
6289 Node* objSessionK = load_field_from_object(aescrypt_object, "sessionK", "[Ljava/lang/Object;", /*is_exact*/ false);
6290 assert (objSessionK != NULL, "wrong version of com.sun.crypto.provider.AESCrypt");
6291 if (objSessionK == NULL) return (Node *) NULL;
6292 Node* objAESCryptKey = load_array_element(control(), objSessionK, intcon(0), TypeAryPtr::OOPS);
6293 #else
6294 Node* objAESCryptKey = load_field_from_object(aescrypt_object, "K", "[I", /*is_exact*/ false);
6295 #endif
6296 assert (objAESCryptKey != NULL, "wrong version of com.sun.crypto.provider.AESCrypt");
6297 if (objAESCryptKey == NULL) return (Node *) NULL;
6298
6299 // now have the array, need to get the start address of the K array
6300 Node* k_start = array_element_address(objAESCryptKey, intcon(0), T_INT);
6301 return k_start;
6302 }
6303
6304 //------------------------------get_original_key_start_from_aescrypt_object-----------------------
6305 Node * LibraryCallKit::get_original_key_start_from_aescrypt_object(Node *aescrypt_object) {
6306 Node* objAESCryptKey = load_field_from_object(aescrypt_object, "lastKey", "[B", /*is_exact*/ false);
6307 assert (objAESCryptKey != NULL, "wrong version of com.sun.crypto.provider.AESCrypt");
6308 if (objAESCryptKey == NULL) return (Node *) NULL;
6309
6310 // now have the array, need to get the start address of the lastKey array
6311 Node* original_k_start = array_element_address(objAESCryptKey, intcon(0), T_BYTE);
6312 return original_k_start;
6313 }
6314
6315 //----------------------------inline_cipherBlockChaining_AESCrypt_predicate----------------------------
|