< prev index next >
src/hotspot/cpu/s390/stubGenerator_s390.cpp
Print this page
rev 53755 : 8218991: s390: Add intrinsic for GHASH algorithm
Reviewed-by:
@@ -1840,10 +1840,63 @@
return __ addr_at(start_off);
}
+ // Compute GHASH function.
+ address generate_ghash_processBlocks() {
+ __ align(CodeEntryAlignment);
+ StubCodeMark mark(this, "StubRoutines", "ghash_processBlocks");
+ unsigned int start_off = __ offset(); // Remember stub start address (is rtn value).
+
+ const Register state = Z_ARG1;
+ const Register subkeyH = Z_ARG2;
+ const Register data = Z_ARG3; // 1st of even-odd register pair.
+ const Register blocks = Z_ARG4;
+ const Register len = blocks; // 2nd of even-odd register pair.
+
+ const int param_block_size = 4 * 8;
+ const int frame_resize = param_block_size + 8; // Extra space for copy of fp.
+
+ // Reserve stack space for parameter block (R1).
+ __ z_lgr(Z_R1, Z_SP);
+ __ resize_frame(-frame_resize, Z_R0, true);
+ __ z_aghi(Z_R1, -param_block_size);
+
+ // Fill parameter block.
+ __ z_lg( Z_R0, Address(state));
+ __ z_stg(Z_R0, Address(Z_R1));
+ __ z_lg( Z_R0, Address(state, 8));
+ __ z_stg(Z_R0, Address(Z_R1, 8));
+ __ z_lg( Z_R0, Address(subkeyH));
+ __ z_stg(Z_R0, Address(Z_R1, 16));
+ __ z_lg( Z_R0, Address(subkeyH, 8));
+ __ z_stg(Z_R0, Address(Z_R1, 24));
+
+ // R4+5: data pointer + length
+ __ z_llgfr(len, blocks); // Cast to 64-bit.
+
+ // R0: function code
+ __ load_const_optimized(Z_R0, (int)VM_Version::MsgDigest::_GHASH);
+
+ // Compute.
+ __ z_sllg(len, len, 4); // In bytes.
+ __ kimd(data);
+
+ // Copy back result and free parameter block.
+ __ z_lg( Z_R0, Address(Z_R1));
+ __ z_stg(Z_R0, Address(state));
+ __ z_lg( Z_R0, Address(Z_R1, 8));
+ __ z_stg(Z_R0, Address(state, 8));
+ __ z_aghi(Z_SP, frame_resize);
+
+ __ z_br(Z_R14);
+
+ return __ addr_at(start_off);
+ }
+
+
// Call interface for all SHA* stubs.
//
// Z_ARG1 - source data block. Ptr to leftmost byte to be processed.
// Z_ARG2 - current SHA state. Ptr to state area. This area serves as
// parameter block as required by the crypto instruction.
@@ -2303,10 +2356,15 @@
StubRoutines::_aescrypt_decryptBlock = generate_AES_decryptBlock("AES_decryptBlock");
StubRoutines::_cipherBlockChaining_encryptAESCrypt = generate_cipherBlockChaining_AES_encrypt("AES_encryptBlock_chaining");
StubRoutines::_cipherBlockChaining_decryptAESCrypt = generate_cipherBlockChaining_AES_decrypt("AES_decryptBlock_chaining");
}
+ // Generate GHASH intrinsics code
+ if (UseGHASHIntrinsics) {
+ StubRoutines::_ghash_processBlocks = generate_ghash_processBlocks();
+ }
+
// Generate SHA1/SHA256/SHA512 intrinsics code.
if (UseSHA1Intrinsics) {
StubRoutines::_sha1_implCompress = generate_SHA1_stub(false, "SHA1_singleBlock");
StubRoutines::_sha1_implCompressMB = generate_SHA1_stub(true, "SHA1_multiBlock");
}
< prev index next >