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