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

Shrinivas Joshi shrinivas.joshi at oracle.com
Wed Nov 20 11:00:32 PST 2013


Hi Vladimir, Vitaly,

Thanks again for reviewing this change. Please find updated webrev at 
http://cr.openjdk.java.net/~kvn/8002074/webrev.03/ which incorporates 
the changes that you suggested.

-Shrinivas

On 11/15/2013 12:30 PM, Shrinivas Joshi wrote:
> Hi Vladimir,
>
> Thanks for the feedback. I will make these changes and update the webrev.
>
> -Shrinivas
>
> On 11/15/2013 12:22 PM, Vladimir Kozlov wrote:
>> 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