< prev index next >

src/share/vm/opto/library_call.cpp

Print this page
rev 7958 : 8152172: PPC64: Support AES intrinsics
Reviewed-by: kvn, mdoerr, simonis
Contributed-by: horii@jp.ibm.com


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----------------------------


< prev index next >