RFR(L): 8002074: Support for AES on SPARC

Vladimir Kozlov vladimir.kozlov at oracle.com
Fri Nov 15 12:22:13 PST 2013


Shrinivas,

I suggested before to use loops to generated less code lines in stubs. 
For example, next:

+     // load expanded key
+     __ ldf(FloatRegisterImpl::D, key, 0, F0);
+     __ ldf(FloatRegisterImpl::D, key, 8, F2);
+     ...
+     __ ldf(FloatRegisterImpl::D, key, 152, F38);

could be replaced with

     // load expanded key
     for (int i = 0; i < 40; i += 2) {
       __ ldf(FloatRegisterImpl::D, key, i*4, as_FloatRegister(i));
     }

Next:

+     __ aes_eround01(F4, F54, F56, F58); //round 1
+     __ aes_eround23(F6, F54, F56, F60);
+     __ aes_eround01(F8, F58, F60, F54); //round 2
+     __ aes_eround23(F10, F58, F60, F56);
       ...
+     __ aes_eround01(F36, F54, F56, F58); //round 9
+     __ aes_eround23(F38, F54, F56, F60);

could be:

     for (int i = 4; i < 36; i += 8) {
       __ aes_eround01(as_FloatRegister(i  ), F54, F56, F58); //round 1
       __ aes_eround23(as_FloatRegister(i+2), F54, F56, F60);
       __ aes_eround01(as_FloatRegister(i+4), F58, F60, F54); //round 2
       __ aes_eround23(as_FloatRegister(i+6), F58, F60, F56);
     }
     __ aes_eround01(F36, F54, F56, F58); //round 9
     __ aes_eround23(F38, F54, F56, F60);


And other places where there is repetitive pattern.

Thanks,
Vladimir

On 11/14/13 6:34 PM, Shrinivas Joshi wrote:
> Hi,
>
> Can I please request reviews for the following change? Target JDK
> release for this change would be the next update of JDK 8 / JDK 9.
>
> Thanks,
> -Shrinivas
>
> RFE: https://bugs.openjdk.java.net/browse/JDK-8002074
> Webrev: http://cr.openjdk.java.net/~kvn/8002074/webrev.02/
>
> Summary: This change adds intrinsics/stub routines support for
> single-block and multi-block (as used by Cipher Block Chaining mode) AES
> encryption and decryption operations on the SPARC platform. These
> intrinsics are available only when the application is configured to use
> SunJCE crypto provider. These stubs make use of efficient hardware AES
> instructions and thus offer significant performance improvements over
> JITed code. AES intrinsics are enabled by default on SPARC platforms
> that support AES instructions. They can be explicitly enabled or
> disabled on the command-line using UseAES and UseAESIntrinsics JVM flags.
>
> Summary of source code changes:
>     * src/cpu/sparc/vm/assembler_sparc.hpp
>        - Adds support for all 3-operand and 4-operand SPARC AES
> instructions. Also adds support for floating-point XOR (FXORs/FXORd)
> instructions. FXOR instructions are used in the AES stub routines
>     * src/cpu/sparc/vm/stubGenerator_sparc.cpp
>        - Defines stubs for single-block and multi-block AES encryption
> and decryption routines supporting all key sizes (128-bit, 192-bit and
> 256-bit).
>        - Current SPARC AES decryption instructions are not compatible
> with SunJCE expanded decryption key format. Thus decryption stubs read
> the original key (passed as an input parameter) and perform decryption
> key expansion using hardware instructions.
>        - Multi-block decryption stub can perform decryption for 2 *
> 16-byte blocks at a time.
>        - Encryption stubs use SunJCE expanded encryption key as their is
> no incompatibility issue between SPARC AES encryption instructions and
> SunJCE expanded encryption keys.
>     * src/cpu/sparc/vm/sparc.ad, src/cpu/x86/vm/x86.ad and
> src/share/vm/opto/matcher.hpp
>        - The additional original key array reference parameter is
> required only on the SPARC platform. This code guards it from being
> passed to the x86 AES stub routines.
>     * src/cpu/sparc/vm/vm_version_sparc.cpp,
> src/cpu/sparc/vm/vm_version_sparc.hpp and
> src/os_cpu/solaris_sparc/vm/vm_version_solaris_sparc.cpp
>        - Detect AES capabilities of the underlying CPU.
>        - Enable 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/classfile/vmSymbols.hpp
>        - Fix for "8012900: CICO ignores AAD in GCM mode" changes return
> type of com.sun.crypto.provider.CipherBlockChaining.encrypt() and
> com.sun.crypto.provider.CipherBlockChaining.decrypt() from void to int.
> Method signature in intrinsics definition had to be changed accordingly.
>     * src/share/vm/opto/library_call.cpp
>        - Adds a new method to read 'lastKey' field of
> com.sun.crypto.provider.AESCrypt class which holds the original key.
>        - Passes additional input parameter, original key array
> reference, to the AES stubs only on the SPARC platform.
>        - Addresses change in return value from 'void' to 'int' in case
> of multi-block CBC stubs.
>     * src/share/vm/opto/runtime.cpp
>        - Reads the additional input parameter (original key reference)
> only on SPARC platform.
>        - Addresses change in return value from 'void' to 'int' in case
> of multi-block CBC stubs.
>     * hotspot/test/compiler/7184394/TestAESMain.java
>        - This test case was contributed as part of the x86 AES
> intrinsics work by Tom Deneau @AMD. Fixed incorrect nano-second to
> milli-second conversion code. Added warm-up phase since this test case
> can also be used for performance testing.
>
> Testing: jtreg, ctw, nsk and JPRT


More information about the hotspot-compiler-dev mailing list