6442 cbcCrypt = make_runtime_call(RC_LEAF|RC_NO_FP,
6443 OptoRuntime::cipherBlockChaining_aescrypt_Type(),
6444 stubAddr, stubName, TypePtr::BOTTOM,
6445 src_start, dest_start, k_start, r_start, len, original_k_start);
6446 } else {
6447 // Call the stub, passing src_start, dest_start, k_start, r_start and src_len
6448 cbcCrypt = make_runtime_call(RC_LEAF|RC_NO_FP,
6449 OptoRuntime::cipherBlockChaining_aescrypt_Type(),
6450 stubAddr, stubName, TypePtr::BOTTOM,
6451 src_start, dest_start, k_start, r_start, len);
6452 }
6453
6454 // return cipher length (int)
6455 Node* retvalue = _gvn.transform(new (C) ProjNode(cbcCrypt, TypeFunc::Parms));
6456 set_result(retvalue);
6457 return true;
6458 }
6459
6460 //------------------------------get_key_start_from_aescrypt_object-----------------------
6461 Node * LibraryCallKit::get_key_start_from_aescrypt_object(Node *aescrypt_object) {
6462 Node* objAESCryptKey = load_field_from_object(aescrypt_object, "K", "[I", /*is_exact*/ false);
6463 assert (objAESCryptKey != NULL, "wrong version of com.sun.crypto.provider.AESCrypt");
6464 if (objAESCryptKey == NULL) return (Node *) NULL;
6465
6466 // now have the array, need to get the start address of the K array
6467 Node* k_start = array_element_address(objAESCryptKey, intcon(0), T_INT);
6468 return k_start;
6469 }
6470
6471 //------------------------------get_original_key_start_from_aescrypt_object-----------------------
6472 Node * LibraryCallKit::get_original_key_start_from_aescrypt_object(Node *aescrypt_object) {
6473 Node* objAESCryptKey = load_field_from_object(aescrypt_object, "lastKey", "[B", /*is_exact*/ false);
6474 assert (objAESCryptKey != NULL, "wrong version of com.sun.crypto.provider.AESCrypt");
6475 if (objAESCryptKey == NULL) return (Node *) NULL;
6476
6477 // now have the array, need to get the start address of the lastKey array
6478 Node* original_k_start = array_element_address(objAESCryptKey, intcon(0), T_BYTE);
6479 return original_k_start;
6480 }
6481
6482 //----------------------------inline_cipherBlockChaining_AESCrypt_predicate----------------------------
|
6442 cbcCrypt = make_runtime_call(RC_LEAF|RC_NO_FP,
6443 OptoRuntime::cipherBlockChaining_aescrypt_Type(),
6444 stubAddr, stubName, TypePtr::BOTTOM,
6445 src_start, dest_start, k_start, r_start, len, original_k_start);
6446 } else {
6447 // Call the stub, passing src_start, dest_start, k_start, r_start and src_len
6448 cbcCrypt = make_runtime_call(RC_LEAF|RC_NO_FP,
6449 OptoRuntime::cipherBlockChaining_aescrypt_Type(),
6450 stubAddr, stubName, TypePtr::BOTTOM,
6451 src_start, dest_start, k_start, r_start, len);
6452 }
6453
6454 // return cipher length (int)
6455 Node* retvalue = _gvn.transform(new (C) ProjNode(cbcCrypt, TypeFunc::Parms));
6456 set_result(retvalue);
6457 return true;
6458 }
6459
6460 //------------------------------get_key_start_from_aescrypt_object-----------------------
6461 Node * LibraryCallKit::get_key_start_from_aescrypt_object(Node *aescrypt_object) {
6462 #ifdef PPC64
6463 // MixColumns for decryption can be reduced by preprocessing MixColumns with round keys.
6464 // Intel's extention is based on this optimization and AESCrypt generates round keys by preprocessing MixColumns.
6465 // However, ppc64 vncipher processes MixColumns and requires the same round keys with encryption.
6466 // The ppc64 stubs of encryption and decryption use the same round keys (sessionK[0]).
6467 Node* objSessionK = load_field_from_object(aescrypt_object, "sessionK", "[[I", /*is_exact*/ false);
6468 assert (objSessionK != NULL, "wrong version of com.sun.crypto.provider.AESCrypt");
6469 if (objSessionK == NULL) {
6470 return (Node *) NULL;
6471 }
6472 Node* objAESCryptKey = load_array_element(control(), objSessionK, intcon(0), TypeAryPtr::OOPS);
6473 #else
6474 Node* objAESCryptKey = load_field_from_object(aescrypt_object, "K", "[I", /*is_exact*/ false);
6475 #endif // PPC64
6476 assert (objAESCryptKey != NULL, "wrong version of com.sun.crypto.provider.AESCrypt");
6477 if (objAESCryptKey == NULL) return (Node *) NULL;
6478
6479 // now have the array, need to get the start address of the K array
6480 Node* k_start = array_element_address(objAESCryptKey, intcon(0), T_INT);
6481 return k_start;
6482 }
6483
6484 //------------------------------get_original_key_start_from_aescrypt_object-----------------------
6485 Node * LibraryCallKit::get_original_key_start_from_aescrypt_object(Node *aescrypt_object) {
6486 Node* objAESCryptKey = load_field_from_object(aescrypt_object, "lastKey", "[B", /*is_exact*/ false);
6487 assert (objAESCryptKey != NULL, "wrong version of com.sun.crypto.provider.AESCrypt");
6488 if (objAESCryptKey == NULL) return (Node *) NULL;
6489
6490 // now have the array, need to get the start address of the lastKey array
6491 Node* original_k_start = array_element_address(objAESCryptKey, intcon(0), T_BYTE);
6492 return original_k_start;
6493 }
6494
6495 //----------------------------inline_cipherBlockChaining_AESCrypt_predicate----------------------------
|