RFR(M): 8152172: PPC64: Support AES intrinsics

Hiroshi H Horii HORII at jp.ibm.com
Tue Mar 22 15:47:19 UTC 2016


Dear all:

Can I please request reviews for the following change?
This change was created for JDK 9 to enable POWER8's AES 
instructions for AES calculation.

This request follows this discussion.
http://mail.openjdk.java.net/pipermail/hotspot-compiler-dev/2016-March/021926.html

Description:
This change adds stub routines support for single-block AES 
encryption and decryption operations on the POWER8 platform. 
They are available only when the application is configured to 
use SunJCE crypto provider on little endian.

These stubs make use of efficient hardware AES instructions 
and thus offer significant performance improvements over 
JITed code on POWER8 as on x86 and SPARC. AES stub routines 
are enabled by default on POWER8 platforms that support AES 
instructions (vcipher). They can be explicitly enabled or 
disabled on the command-line using UseAES and 
UseAESIntrinsics JVM flags. Unlike x86 and SPARC, vcipher 
and vnchiper of POWER8 need the same round keys of AES. 
Therefore, inline_aescrypt_Block in library_call.cpp calls the 
stub with AESCrypt.sessionK[0] as round keys.

Summary of source code changes:

 *src/cpu/ppc/vm/assembler_ppc.hpp
 *src/cpu/ppc/vm/assembler_ppc.inline.hpp
   - Adds support for vrld instruction to rotate vector register values 
      with left doubleword.

 *src/cpu/ppc/vm/stubGenerator_ppc.cpp
   - Defines stubs for single-block AES encryption and decryption 
      routines supporting all key sizes (128, 192 and 256-bit). 
   - Current POWER AES decryption instructions are not compatible 
      with SunJCE expanded decryption key format. Thus decryption 
      stubs read the expanded encryption keys (sessionK[0]) with 
      descendant order. 
   - Encryption stubs use SunJCE expanded encryption key as their
      is no incompatibility issue between POWER8 AES encryption 
      instructions and SunJCE expanded encryption keys.

 *src/cpu/ppc/vm/vm_version_ppc.cpp
   - Detects AES capabilities of the underlying CPU by using
      has_vcipher().
   - Enables UseAES and UseAESIntrinsics flags if the underlying
      CPU supports AES instructions and neither of them is explicitly 
      disabled on the command-line. Generate warning message if 
      either of these flags are enabled on the command-line 
      whereas the underlying CPU does not support AES instructions.

 *src/share/vm/opto/library_call.cpp
    - Passes the first input parameter, reference to sessionK[0] to the 
       AES stubs only on the POWER platform.

  *src/share/vm/opto/graphKit.cpp
    - Supports T_NARROWOOP type for GraphKit::load_array_element.

Bug: https://bugs.openjdk.java.net/browse/JDK-8152172
Webrev: http://cr.openjdk.java.net/~mdoerr/8152172_ppc64le_aes/webrev.00/


Regards,
Hiroshi
-----------------------
Hiroshi Horii,
IBM Research - Tokyo


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openjdk.java.net/pipermail/hotspot-compiler-dev/attachments/20160323/24f84d24/attachment.html>


More information about the hotspot-compiler-dev mailing list