Projects
Mega:24.03:SP1:Everything
openjdk-1.8.0
_service:tar_scm:0020-8251216-Implement-MD5-Int...
Sign Up
Log In
Username
Password
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File _service:tar_scm:0020-8251216-Implement-MD5-Intrinsics-on-aarch64.patch of Package openjdk-1.8.0
Date: Thu, 8 Jun 2023 20:00:56 +0800 Subject: 8251216:Implement MD5 Intrinsics on aarch64 Bug url: https://bugs.openjdk.org/browse/JDK-8251216 --- .../cpu/aarch64/vm/stubGenerator_aarch64.cpp | 196 ++++++++++++++++++ .../cpu/aarch64/vm/stubRoutines_aarch64.hpp | 2 +- .../src/cpu/aarch64/vm/vm_version_aarch64.cpp | 4 + hotspot/src/cpu/ppc/vm/vm_version_ppc.cpp | 5 + hotspot/src/cpu/x86/vm/vm_version_x86.cpp | 5 + hotspot/src/share/vm/classfile/vmSymbols.cpp | 7 +- hotspot/src/share/vm/classfile/vmSymbols.hpp | 11 +- hotspot/src/share/vm/opto/c2compiler.cpp | 1 + hotspot/src/share/vm/opto/escape.cpp | 2 + hotspot/src/share/vm/opto/library_call.cpp | 165 ++++++++------- hotspot/src/share/vm/opto/runtime.cpp | 2 +- hotspot/src/share/vm/opto/runtime.hpp | 2 +- hotspot/src/share/vm/runtime/globals.hpp | 3 + hotspot/src/share/vm/runtime/stubRoutines.cpp | 2 + hotspot/src/share/vm/runtime/stubRoutines.hpp | 4 + .../sha/{TestSHA.java => TestDigest.java} | 110 ++++++---- ...ptionsBase.java => DigestOptionsBase.java} | 105 ++++------ ...tUseMD5IntrinsicsOptionOnSupportedCPU.java | 46 ++++ ...seMD5IntrinsicsOptionOnUnsupportedCPU.java | 51 +++++ ...UseSHA1IntrinsicsOptionOnSupportedCPU.java | 6 +- ...eSHA1IntrinsicsOptionOnUnsupportedCPU.java | 12 +- ...eSHA256IntrinsicsOptionOnSupportedCPU.java | 6 +- ...HA256IntrinsicsOptionOnUnsupportedCPU.java | 12 +- ...eSHA512IntrinsicsOptionOnSupportedCPU.java | 6 +- ...HA512IntrinsicsOptionOnUnsupportedCPU.java | 12 +- .../cli/TestUseSHAOptionOnSupportedCPU.java | 8 +- .../cli/TestUseSHAOptionOnUnsupportedCPU.java | 12 +- .../testcases/GenericTestCaseForOtherCPU.java | 9 +- ...GenericTestCaseForSupportedAArch64CPU.java | 28 ++- .../GenericTestCaseForSupportedSparcCPU.java | 28 ++- ...nericTestCaseForUnsupportedAArch64CPU.java | 14 +- ...GenericTestCaseForUnsupportedSparcCPU.java | 14 +- .../GenericTestCaseForUnsupportedX86CPU.java | 15 +- ...pecificTestCaseForUnsupportedSparcCPU.java | 7 +- ...ASpecificTestCaseForSupportedSparcCPU.java | 48 +++-- ...pecificTestCaseForUnsupportedSparcCPU.java | 31 +-- ...estBase.java => DigestSanityTestBase.java} | 20 +- .../sha/sanity/TestMD5Intrinsics.java | 66 ++++++ .../sanity/TestMD5MultiBlockIntrinsics.java | 74 +++++++ .../sha/sanity/TestSHA1Intrinsics.java | 6 +- .../sanity/TestSHA1MultiBlockIntrinsics.java | 10 +- .../sha/sanity/TestSHA256Intrinsics.java | 6 +- .../TestSHA256MultiBlockIntrinsics.java | 14 +- .../sha/sanity/TestSHA512Intrinsics.java | 6 +- .../TestSHA512MultiBlockIntrinsics.java | 14 +- .../sha/predicate/IntrinsicPredicates.java | 24 +++ .../classes/sun/security/provider/MD5.java | 19 ++ .../classes/sun/security/provider/SHA.java | 4 +- 48 files changed, 927 insertions(+), 327 deletions(-) rename hotspot/test/compiler/intrinsics/sha/{TestSHA.java => TestDigest.java} (53%) rename hotspot/test/compiler/intrinsics/sha/cli/{SHAOptionsBase.java => DigestOptionsBase.java} (55%) create mode 100644 hotspot/test/compiler/intrinsics/sha/cli/TestUseMD5IntrinsicsOptionOnSupportedCPU.java create mode 100644 hotspot/test/compiler/intrinsics/sha/cli/TestUseMD5IntrinsicsOptionOnUnsupportedCPU.java rename hotspot/test/compiler/intrinsics/sha/sanity/{SHASanityTestBase.java => DigestSanityTestBase.java} (83%) create mode 100644 hotspot/test/compiler/intrinsics/sha/sanity/TestMD5Intrinsics.java create mode 100644 hotspot/test/compiler/intrinsics/sha/sanity/TestMD5MultiBlockIntrinsics.java diff --git a/hotspot/src/cpu/aarch64/vm/stubGenerator_aarch64.cpp b/hotspot/src/cpu/aarch64/vm/stubGenerator_aarch64.cpp index c024dec55..a3f93204e 100644 --- a/hotspot/src/cpu/aarch64/vm/stubGenerator_aarch64.cpp +++ b/hotspot/src/cpu/aarch64/vm/stubGenerator_aarch64.cpp @@ -3064,6 +3064,7 @@ class StubGenerator: public StubCodeGenerator { } + // Arguments: // // Inputs: @@ -3174,6 +3175,196 @@ class StubGenerator: public StubCodeGenerator { return start; } + + // Arguments: + // + // Inputs: + // c_rarg0 - byte[] source+offset + // c_rarg1 - int[] SHA.state + // c_rarg2 - int offset + // c_rarg3 - int limit + // + address generate_md5_implCompress(bool multi_block, const char *name) { + __ align(CodeEntryAlignment); + StubCodeMark mark(this, "StubRoutines", name); + address start = __ pc(); + + Register buf = c_rarg0; + Register state = c_rarg1; + Register ofs = c_rarg2; + Register limit = c_rarg3; + Register a = r4; + Register b = r5; + Register c = r6; + Register d = r7; + Register rscratch3 = r10; + Register rscratch4 = r11; + + Label keys; + Label md5_loop; + + __ BIND(md5_loop); + + // Save hash values for addition after rounds + __ ldrw(a, Address(state, 0)); + __ ldrw(b, Address(state, 4)); + __ ldrw(c, Address(state, 8)); + __ ldrw(d, Address(state, 12)); + +#define FF(r1, r2, r3, r4, k, s, t) \ + __ eorw(rscratch3, r3, r4); \ + __ movw(rscratch2, t); \ + __ andw(rscratch3, rscratch3, r2); \ + __ addw(rscratch4, r1, rscratch2); \ + __ ldrw(rscratch1, Address(buf, k*4)); \ + __ eorw(rscratch3, rscratch3, r4); \ + __ addw(rscratch3, rscratch3, rscratch1); \ + __ addw(rscratch3, rscratch3, rscratch4); \ + __ rorw(rscratch2, rscratch3, 32 - s); \ + __ addw(r1, rscratch2, r2); + +#define GG(r1, r2, r3, r4, k, s, t) \ + __ eorw(rscratch2, r2, r3); \ + __ ldrw(rscratch1, Address(buf, k*4)); \ + __ andw(rscratch3, rscratch2, r4); \ + __ movw(rscratch2, t); \ + __ eorw(rscratch3, rscratch3, r3); \ + __ addw(rscratch4, r1, rscratch2); \ + __ addw(rscratch3, rscratch3, rscratch1); \ + __ addw(rscratch3, rscratch3, rscratch4); \ + __ rorw(rscratch2, rscratch3, 32 - s); \ + __ addw(r1, rscratch2, r2); + +#define HH(r1, r2, r3, r4, k, s, t) \ + __ eorw(rscratch3, r3, r4); \ + __ movw(rscratch2, t); \ + __ addw(rscratch4, r1, rscratch2); \ + __ ldrw(rscratch1, Address(buf, k*4)); \ + __ eorw(rscratch3, rscratch3, r2); \ + __ addw(rscratch3, rscratch3, rscratch1); \ + __ addw(rscratch3, rscratch3, rscratch4); \ + __ rorw(rscratch2, rscratch3, 32 - s); \ + __ addw(r1, rscratch2, r2); + +#define II(r1, r2, r3, r4, k, s, t) \ + __ movw(rscratch3, t); \ + __ ornw(rscratch2, r2, r4); \ + __ addw(rscratch4, r1, rscratch3); \ + __ ldrw(rscratch1, Address(buf, k*4)); \ + __ eorw(rscratch3, rscratch2, r3); \ + __ addw(rscratch3, rscratch3, rscratch1); \ + __ addw(rscratch3, rscratch3, rscratch4); \ + __ rorw(rscratch2, rscratch3, 32 - s); \ + __ addw(r1, rscratch2, r2); + + // Round 1 + FF(a, b, c, d, 0, 7, 0xd76aa478) + FF(d, a, b, c, 1, 12, 0xe8c7b756) + FF(c, d, a, b, 2, 17, 0x242070db) + FF(b, c, d, a, 3, 22, 0xc1bdceee) + FF(a, b, c, d, 4, 7, 0xf57c0faf) + FF(d, a, b, c, 5, 12, 0x4787c62a) + FF(c, d, a, b, 6, 17, 0xa8304613) + FF(b, c, d, a, 7, 22, 0xfd469501) + FF(a, b, c, d, 8, 7, 0x698098d8) + FF(d, a, b, c, 9, 12, 0x8b44f7af) + FF(c, d, a, b, 10, 17, 0xffff5bb1) + FF(b, c, d, a, 11, 22, 0x895cd7be) + FF(a, b, c, d, 12, 7, 0x6b901122) + FF(d, a, b, c, 13, 12, 0xfd987193) + FF(c, d, a, b, 14, 17, 0xa679438e) + FF(b, c, d, a, 15, 22, 0x49b40821) + + // Round 2 + GG(a, b, c, d, 1, 5, 0xf61e2562) + GG(d, a, b, c, 6, 9, 0xc040b340) + GG(c, d, a, b, 11, 14, 0x265e5a51) + GG(b, c, d, a, 0, 20, 0xe9b6c7aa) + GG(a, b, c, d, 5, 5, 0xd62f105d) + GG(d, a, b, c, 10, 9, 0x02441453) + GG(c, d, a, b, 15, 14, 0xd8a1e681) + GG(b, c, d, a, 4, 20, 0xe7d3fbc8) + GG(a, b, c, d, 9, 5, 0x21e1cde6) + GG(d, a, b, c, 14, 9, 0xc33707d6) + GG(c, d, a, b, 3, 14, 0xf4d50d87) + GG(b, c, d, a, 8, 20, 0x455a14ed) + GG(a, b, c, d, 13, 5, 0xa9e3e905) + GG(d, a, b, c, 2, 9, 0xfcefa3f8) + GG(c, d, a, b, 7, 14, 0x676f02d9) + GG(b, c, d, a, 12, 20, 0x8d2a4c8a) + + // Round 3 + HH(a, b, c, d, 5, 4, 0xfffa3942) + HH(d, a, b, c, 8, 11, 0x8771f681) + HH(c, d, a, b, 11, 16, 0x6d9d6122) + HH(b, c, d, a, 14, 23, 0xfde5380c) + HH(a, b, c, d, 1, 4, 0xa4beea44) + HH(d, a, b, c, 4, 11, 0x4bdecfa9) + HH(c, d, a, b, 7, 16, 0xf6bb4b60) + HH(b, c, d, a, 10, 23, 0xbebfbc70) + HH(a, b, c, d, 13, 4, 0x289b7ec6) + HH(d, a, b, c, 0, 11, 0xeaa127fa) + HH(c, d, a, b, 3, 16, 0xd4ef3085) + HH(b, c, d, a, 6, 23, 0x04881d05) + HH(a, b, c, d, 9, 4, 0xd9d4d039) + HH(d, a, b, c, 12, 11, 0xe6db99e5) + HH(c, d, a, b, 15, 16, 0x1fa27cf8) + HH(b, c, d, a, 2, 23, 0xc4ac5665) + + // Round 4 + II(a, b, c, d, 0, 6, 0xf4292244) + II(d, a, b, c, 7, 10, 0x432aff97) + II(c, d, a, b, 14, 15, 0xab9423a7) + II(b, c, d, a, 5, 21, 0xfc93a039) + II(a, b, c, d, 12, 6, 0x655b59c3) + II(d, a, b, c, 3, 10, 0x8f0ccc92) + II(c, d, a, b, 10, 15, 0xffeff47d) + II(b, c, d, a, 1, 21, 0x85845dd1) + II(a, b, c, d, 8, 6, 0x6fa87e4f) + II(d, a, b, c, 15, 10, 0xfe2ce6e0) + II(c, d, a, b, 6, 15, 0xa3014314) + II(b, c, d, a, 13, 21, 0x4e0811a1) + II(a, b, c, d, 4, 6, 0xf7537e82) + II(d, a, b, c, 11, 10, 0xbd3af235) + II(c, d, a, b, 2, 15, 0x2ad7d2bb) + II(b, c, d, a, 9, 21, 0xeb86d391) + +#undef FF +#undef GG +#undef HH +#undef II + + // write hash values back in the correct order + __ ldrw(rscratch1, Address(state, 0)); + __ addw(rscratch1, rscratch1, a); + __ strw(rscratch1, Address(state, 0)); + + __ ldrw(rscratch2, Address(state, 4)); + __ addw(rscratch2, rscratch2, b); + __ strw(rscratch2, Address(state, 4)); + + __ ldrw(rscratch3, Address(state, 8)); + __ addw(rscratch3, rscratch3, c); + __ strw(rscratch3, Address(state, 8)); + + __ ldrw(rscratch4, Address(state, 12)); + __ addw(rscratch4, rscratch4, d); + __ strw(rscratch4, Address(state, 12)); + + if (multi_block) { + __ add(buf, buf, 64); + __ add(ofs, ofs, 64); + __ cmp(ofs, limit); + __ br(Assembler::LE, md5_loop); + __ mov(c_rarg0, ofs); // return ofs + } + + __ ret(lr); + + return start; + } + + // Arguments: // // Inputs: @@ -5017,6 +5208,11 @@ class StubGenerator: public StubCodeGenerator { StubRoutines::_counterMode_AESCrypt = generate_counterMode_AESCrypt(); } + if (UseMD5Intrinsics) { + StubRoutines::_md5_implCompress = generate_md5_implCompress(false, "md5_implCompress"); + StubRoutines::_md5_implCompressMB = generate_md5_implCompress(true, "md5_implCompressMB"); + } + if (UseSHA1Intrinsics) { StubRoutines::_sha1_implCompress = generate_sha1_implCompress(false, "sha1_implCompress"); StubRoutines::_sha1_implCompressMB = generate_sha1_implCompress(true, "sha1_implCompressMB"); diff --git a/hotspot/src/cpu/aarch64/vm/stubRoutines_aarch64.hpp b/hotspot/src/cpu/aarch64/vm/stubRoutines_aarch64.hpp index 05619ce7f..212e1030d 100644 --- a/hotspot/src/cpu/aarch64/vm/stubRoutines_aarch64.hpp +++ b/hotspot/src/cpu/aarch64/vm/stubRoutines_aarch64.hpp @@ -37,7 +37,7 @@ static bool returns_to_call_stub(address return_pc) { enum platform_dependent_constants { code_size1 = 19000, // simply increase if too small (assembler will crash if too small) - code_size2 = 32000 // simply increase if too small (assembler will crash if too small) + code_size2 = 45000 // simply increase if too small (assembler will crash if too small) }; class aarch64 { diff --git a/hotspot/src/cpu/aarch64/vm/vm_version_aarch64.cpp b/hotspot/src/cpu/aarch64/vm/vm_version_aarch64.cpp index de636fb83..ff28cf939 100644 --- a/hotspot/src/cpu/aarch64/vm/vm_version_aarch64.cpp +++ b/hotspot/src/cpu/aarch64/vm/vm_version_aarch64.cpp @@ -264,6 +264,10 @@ void VM_Version::get_processor_features() { UseCRC32Intrinsics = true; } + if (FLAG_IS_DEFAULT(UseMD5Intrinsics)) { + UseMD5Intrinsics = true; + } + if (auxv & (HWCAP_SHA1 | HWCAP_SHA2)) { if (FLAG_IS_DEFAULT(UseSHA)) { FLAG_SET_DEFAULT(UseSHA, true); diff --git a/hotspot/src/cpu/ppc/vm/vm_version_ppc.cpp b/hotspot/src/cpu/ppc/vm/vm_version_ppc.cpp index fea8b1f87..a5a80d292 100644 --- a/hotspot/src/cpu/ppc/vm/vm_version_ppc.cpp +++ b/hotspot/src/cpu/ppc/vm/vm_version_ppc.cpp @@ -204,6 +204,11 @@ void VM_Version::initialize() { FLAG_SET_DEFAULT(UseGHASHIntrinsics, false); } + if (UseMD5Intrinsics) { + warning("MD5 intrinsics are not available on this CPU"); + FLAG_SET_DEFAULT(UseMD5Intrinsics, false); + } + if (has_vshasig()) { if (FLAG_IS_DEFAULT(UseSHA)) { UseSHA = true; diff --git a/hotspot/src/cpu/x86/vm/vm_version_x86.cpp b/hotspot/src/cpu/x86/vm/vm_version_x86.cpp index ce3037d76..41f827364 100644 --- a/hotspot/src/cpu/x86/vm/vm_version_x86.cpp +++ b/hotspot/src/cpu/x86/vm/vm_version_x86.cpp @@ -669,6 +669,11 @@ void VM_Version::get_processor_features() { FLAG_SET_DEFAULT(UseF2jBLASIntrinsics, false); } + if (UseMD5Intrinsics) { + warning("MD5 intrinsics are not available on this CPU"); + FLAG_SET_DEFAULT(UseMD5Intrinsics, false); + } + // Adjust RTM (Restricted Transactional Memory) flags if (!supports_rtm() && UseRTMLocking) { // Can't continue because UseRTMLocking affects UseBiasedLocking flag diff --git a/hotspot/src/share/vm/classfile/vmSymbols.cpp b/hotspot/src/share/vm/classfile/vmSymbols.cpp index 9633e4609..74926f6a0 100644 --- a/hotspot/src/share/vm/classfile/vmSymbols.cpp +++ b/hotspot/src/share/vm/classfile/vmSymbols.cpp @@ -435,7 +435,7 @@ int vmIntrinsics::predicates_needed(vmIntrinsics::ID id) { case vmIntrinsics::_counterMode_AESCrypt: return 1; case vmIntrinsics::_digestBase_implCompressMB: - return 3; + return 4; default: return 0; } @@ -578,6 +578,9 @@ bool vmIntrinsics::is_disabled_by_flags(vmIntrinsics::ID id) { return true; } break; + case vmIntrinsics::_md5_implCompress: + if (!UseMD5Intrinsics) return true; + break; case vmIntrinsics::_sha_implCompress: if (!UseSHA1Intrinsics) return true; break; @@ -588,7 +591,7 @@ bool vmIntrinsics::is_disabled_by_flags(vmIntrinsics::ID id) { if (!UseSHA512Intrinsics) return true; break; case vmIntrinsics::_digestBase_implCompressMB: - if (!(UseSHA1Intrinsics || UseSHA256Intrinsics || UseSHA512Intrinsics)) return true; + if (!(UseMD5Intrinsics || UseSHA1Intrinsics || UseSHA256Intrinsics || UseSHA512Intrinsics)) return true; break; case vmIntrinsics::_ghash_processBlocks: if (!UseGHASHIntrinsics) return true; diff --git a/hotspot/src/share/vm/classfile/vmSymbols.hpp b/hotspot/src/share/vm/classfile/vmSymbols.hpp index 242660259..5f2a9a720 100644 --- a/hotspot/src/share/vm/classfile/vmSymbols.hpp +++ b/hotspot/src/share/vm/classfile/vmSymbols.hpp @@ -848,11 +848,15 @@ do_intrinsic(_counterMode_AESCrypt, com_sun_crypto_provider_counterMode, crypt_name, byteArray_int_int_byteArray_int_signature, F_R) \ do_name( crypt_name, "implCrypt") \ \ + /* support for sun.security.provider.MD5 */ \ + do_class(sun_security_provider_md5, "sun/security/provider/MD5") \ + do_intrinsic(_md5_implCompress, sun_security_provider_md5, implCompress_name, implCompress_signature, F_R) \ + do_name( implCompress_name, "implCompress0") \ + do_signature(implCompress_signature, "([BI)V") \ + \ /* support for sun.security.provider.SHA */ \ do_class(sun_security_provider_sha, "sun/security/provider/SHA") \ do_intrinsic(_sha_implCompress, sun_security_provider_sha, implCompress_name, implCompress_signature, F_R) \ - do_name( implCompress_name, "implCompress0") \ - do_signature(implCompress_signature, "([BI)V") \ \ /* support for com.github.fommil.netlib.F2jBLAS */ \ do_class(com_github_fommil_netlib_f2jblas, "com/github/fommil/netlib/F2jBLAS") \ @@ -1359,6 +1363,9 @@ public: // false otherwise. Implements functionality common to the C1 // and the C2 compiler. static bool is_disabled_by_flags(vmIntrinsics::ID id); + static bool is_intrinsic_available(vmIntrinsics::ID id) { + return !is_disabled_by_flags(id); + } }; #endif // SHARE_VM_CLASSFILE_VMSYMBOLS_HPP diff --git a/hotspot/src/share/vm/opto/c2compiler.cpp b/hotspot/src/share/vm/opto/c2compiler.cpp index 64de417f6..d2485ddfc 100644 --- a/hotspot/src/share/vm/opto/c2compiler.cpp +++ b/hotspot/src/share/vm/opto/c2compiler.cpp @@ -417,6 +417,7 @@ bool C2Compiler::is_intrinsic_supported(methodHandle method, bool is_virtual) { case vmIntrinsics::_cipherBlockChaining_encryptAESCrypt: case vmIntrinsics::_cipherBlockChaining_decryptAESCrypt: case vmIntrinsics::_counterMode_AESCrypt: + case vmIntrinsics::_md5_implCompress: case vmIntrinsics::_sha_implCompress: case vmIntrinsics::_sha2_implCompress: case vmIntrinsics::_sha5_implCompress: diff --git a/hotspot/src/share/vm/opto/escape.cpp b/hotspot/src/share/vm/opto/escape.cpp index a0e497f08..bd9b6a27b 100644 --- a/hotspot/src/share/vm/opto/escape.cpp +++ b/hotspot/src/share/vm/opto/escape.cpp @@ -954,6 +954,8 @@ void ConnectionGraph::process_call_arguments(CallNode *call) { strcmp(call->as_CallLeaf()->_name, "cipherBlockChaining_decryptAESCrypt") == 0 || strcmp(call->as_CallLeaf()->_name, "counterMode_AESCrypt") == 0 || strcmp(call->as_CallLeaf()->_name, "ghash_processBlocks") == 0 || + strcmp(call->as_CallLeaf()->_name, "md5_implCompress") == 0 || + strcmp(call->as_CallLeaf()->_name, "md5_implCompressMB") == 0 || strcmp(call->as_CallLeaf()->_name, "sha1_implCompress") == 0 || strcmp(call->as_CallLeaf()->_name, "sha1_implCompressMB") == 0 || strcmp(call->as_CallLeaf()->_name, "sha256_implCompress") == 0 || diff --git a/hotspot/src/share/vm/opto/library_call.cpp b/hotspot/src/share/vm/opto/library_call.cpp index 9ba5201f0..e85b31b62 100644 --- a/hotspot/src/share/vm/opto/library_call.cpp +++ b/hotspot/src/share/vm/opto/library_call.cpp @@ -317,13 +317,13 @@ class LibraryCallKit : public GraphKit { Node* get_key_start_from_aescrypt_object(Node* aescrypt_object); Node* get_original_key_start_from_aescrypt_object(Node* aescrypt_object); bool inline_ghash_processBlocks(); - bool inline_sha_implCompress(vmIntrinsics::ID id); + bool inline_digestBase_implCompress(vmIntrinsics::ID id); bool inline_digestBase_implCompressMB(int predicate); - bool inline_sha_implCompressMB(Node* digestBaseObj, ciInstanceKlass* instklass_SHA, - bool long_state, address stubAddr, const char *stubName, - Node* src_start, Node* ofs, Node* limit); - Node* get_state_from_sha_object(Node *sha_object); - Node* get_state_from_sha5_object(Node *sha_object); + bool inline_digestBase_implCompressMB(Node* digestBaseObj, ciInstanceKlass* instklass, + bool long_state, address stubAddr, const char *stubName, + Node* src_start, Node* ofs, Node* limit); + Node* get_state_from_digest_object(Node *digestBase_object); + Node* get_long_state_from_digest_object(Node *digestBase_object); Node* inline_digestBase_implCompressMB_predicate(int predicate); bool inline_encodeISOArray(); bool inline_updateCRC32(); @@ -677,10 +677,11 @@ bool LibraryCallKit::try_to_inline(int predicate) { case vmIntrinsics::_counterMode_AESCrypt: return inline_counterMode_AESCrypt(intrinsic_id()); + case vmIntrinsics::_md5_implCompress: case vmIntrinsics::_sha_implCompress: case vmIntrinsics::_sha2_implCompress: case vmIntrinsics::_sha5_implCompress: - return inline_sha_implCompress(intrinsic_id()); + return inline_digestBase_implCompress(intrinsic_id()); case vmIntrinsics::_digestBase_implCompressMB: return inline_digestBase_implCompressMB(predicate); @@ -6758,7 +6759,10 @@ bool LibraryCallKit::inline_ghash_processBlocks() { return true; } -//------------------------------inline_sha_implCompress----------------------- +//------------------------------inline_digestBase_implCompress----------------------- +// +// Calculate MD5 for single-block byte[] array. +// void com.sun.security.provider.MD5.implCompress(byte[] buf, int ofs) // // Calculate SHA (i.e., SHA-1) for single-block byte[] array. // void com.sun.security.provider.SHA.implCompress(byte[] buf, int ofs) @@ -6769,12 +6773,12 @@ bool LibraryCallKit::inline_ghash_processBlocks() { // Calculate SHA5 (i.e., SHA-384 or SHA-512) for single-block byte[] array. // void com.sun.security.provider.SHA5.implCompress(byte[] buf, int ofs) // -bool LibraryCallKit::inline_sha_implCompress(vmIntrinsics::ID id) { +bool LibraryCallKit::inline_digestBase_implCompress(vmIntrinsics::ID id) { assert(callee()->signature()->size() == 2, "sha_implCompress has 2 parameters"); - Node* sha_obj = argument(0); - Node* src = argument(1); // type oop - Node* ofs = argument(2); // type int + Node* digestBase_obj = argument(0); + Node* src = argument(1); // type oop + Node* ofs = argument(2); // type int const Type* src_type = src->Value(&_gvn); const TypeAryPtr* top_src = src_type->isa_aryptr(); @@ -6794,21 +6798,27 @@ bool LibraryCallKit::inline_sha_implCompress(vmIntrinsics::ID id) { const char *stubName; switch(id) { + case vmIntrinsics::_md5_implCompress: + assert(UseMD5Intrinsics, "need MD5 instruction support"); + state = get_state_from_digest_object(digestBase_obj); + stubAddr = StubRoutines::md5_implCompress(); + stubName = "md5_implCompress"; + break; case vmIntrinsics::_sha_implCompress: assert(UseSHA1Intrinsics, "need SHA1 instruction support"); - state = get_state_from_sha_object(sha_obj); + state = get_state_from_digest_object(digestBase_obj); stubAddr = StubRoutines::sha1_implCompress(); stubName = "sha1_implCompress"; break; case vmIntrinsics::_sha2_implCompress: assert(UseSHA256Intrinsics, "need SHA256 instruction support"); - state = get_state_from_sha_object(sha_obj); + state = get_state_from_digest_object(digestBase_obj); stubAddr = StubRoutines::sha256_implCompress(); stubName = "sha256_implCompress"; break; case vmIntrinsics::_sha5_implCompress: assert(UseSHA512Intrinsics, "need SHA512 instruction support"); - state = get_state_from_sha5_object(sha_obj); + state = get_long_state_from_digest_object(digestBase_obj); stubAddr = StubRoutines::sha512_implCompress(); stubName = "sha512_implCompress"; break; @@ -6819,7 +6829,7 @@ bool LibraryCallKit::inline_sha_implCompress(vmIntrinsics::ID id) { if (state == NULL) return false; // Call the stub. - Node* call = make_runtime_call(RC_LEAF|RC_NO_FP, OptoRuntime::sha_implCompress_Type(), + Node* call = make_runtime_call(RC_LEAF|RC_NO_FP, OptoRuntime::digestBase_implCompress_Type(), stubAddr, stubName, TypePtr::BOTTOM, src_start, state); @@ -6828,13 +6838,13 @@ bool LibraryCallKit::inline_sha_implCompress(vmIntrinsics::ID id) { //------------------------------inline_digestBase_implCompressMB----------------------- // -// Calculate SHA/SHA2/SHA5 for multi-block byte[] array. +// Calculate MD5/SHA/SHA2/SHA5 for multi-block byte[] array. // int com.sun.security.provider.DigestBase.implCompressMultiBlock(byte[] b, int ofs, int limit) // bool LibraryCallKit::inline_digestBase_implCompressMB(int predicate) { - assert(UseSHA1Intrinsics || UseSHA256Intrinsics || UseSHA512Intrinsics, - "need SHA1/SHA256/SHA512 instruction support"); - assert((uint)predicate < 3, "sanity"); + assert(UseMD5Intrinsics || UseSHA1Intrinsics || UseSHA256Intrinsics || UseSHA512Intrinsics, + "need MD5/SHA1/SHA256/SHA512 instruction support"); + assert((uint)predicate < 4, "sanity"); assert(callee()->signature()->size() == 3, "digestBase_implCompressMB has 3 parameters"); Node* digestBase_obj = argument(0); // The receiver was checked for NULL already. @@ -6856,64 +6866,71 @@ bool LibraryCallKit::inline_digestBase_implCompressMB(int predicate) { // 'src_start' points to src array + offset Node* src_start = array_element_address(src, ofs, src_elem); - const char* klass_SHA_name = NULL; + const char* klass_digestBase_name = NULL; const char* stub_name = NULL; address stub_addr = NULL; bool long_state = false; switch (predicate) { case 0: + if (vmIntrinsics::is_intrinsic_available(vmIntrinsics::_md5_implCompress)) { + klass_digestBase_name = "sun/security/provider/MD5"; + stub_name = "md5_implCompressMB"; + stub_addr = StubRoutines::md5_implCompressMB(); + } + break; + case 1: if (UseSHA1Intrinsics) { - klass_SHA_name = "sun/security/provider/SHA"; + klass_digestBase_name = "sun/security/provider/SHA"; stub_name = "sha1_implCompressMB"; stub_addr = StubRoutines::sha1_implCompressMB(); } break; - case 1: + case 2: if (UseSHA256Intrinsics) { - klass_SHA_name = "sun/security/provider/SHA2"; + klass_digestBase_name = "sun/security/provider/SHA2"; stub_name = "sha256_implCompressMB"; stub_addr = StubRoutines::sha256_implCompressMB(); } break; - case 2: + case 3: if (UseSHA512Intrinsics) { - klass_SHA_name = "sun/security/provider/SHA5"; + klass_digestBase_name = "sun/security/provider/SHA5"; stub_name = "sha512_implCompressMB"; stub_addr = StubRoutines::sha512_implCompressMB(); long_state = true; } break; default: - fatal(err_msg_res("unknown SHA intrinsic predicate: %d", predicate)); + fatal(err_msg_res("unknown DigestBase intrinsic predicate: %d", predicate)); } - if (klass_SHA_name != NULL) { + if (klass_digestBase_name != NULL) { // get DigestBase klass to lookup for SHA klass const TypeInstPtr* tinst = _gvn.type(digestBase_obj)->isa_instptr(); assert(tinst != NULL, "digestBase_obj is not instance???"); assert(tinst->klass()->is_loaded(), "DigestBase is not loaded"); - ciKlass* klass_SHA = tinst->klass()->as_instance_klass()->find_klass(ciSymbol::make(klass_SHA_name)); - assert(klass_SHA->is_loaded(), "predicate checks that this class is loaded"); - ciInstanceKlass* instklass_SHA = klass_SHA->as_instance_klass(); - return inline_sha_implCompressMB(digestBase_obj, instklass_SHA, long_state, stub_addr, stub_name, src_start, ofs, limit); + ciKlass* klass_digestBase = tinst->klass()->as_instance_klass()->find_klass(ciSymbol::make(klass_digestBase_name)); + assert(klass_digestBase->is_loaded(), "predicate checks that this class is loaded"); + ciInstanceKlass* instklass_digestBase = klass_digestBase->as_instance_klass(); + return inline_digestBase_implCompressMB(digestBase_obj, instklass_digestBase, long_state, stub_addr, stub_name, src_start, ofs, limit); } return false; } -//------------------------------inline_sha_implCompressMB----------------------- -bool LibraryCallKit::inline_sha_implCompressMB(Node* digestBase_obj, ciInstanceKlass* instklass_SHA, - bool long_state, address stubAddr, const char *stubName, - Node* src_start, Node* ofs, Node* limit) { - const TypeKlassPtr* aklass = TypeKlassPtr::make(instklass_SHA); +//------------------------------inline_digestBase_implCompressMB----------------------- +bool LibraryCallKit::inline_digestBase_implCompressMB(Node* digestBase_obj, ciInstanceKlass* instklass_digestBase, + bool long_state, address stubAddr, const char *stubName, + Node* src_start, Node* ofs, Node* limit) { + const TypeKlassPtr* aklass = TypeKlassPtr::make(instklass_digestBase); const TypeOopPtr* xtype = aklass->as_instance_type(); - Node* sha_obj = new (C) CheckCastPPNode(control(), digestBase_obj, xtype); - sha_obj = _gvn.transform(sha_obj); + Node* digest_obj = new (C) CheckCastPPNode(control(), digestBase_obj, xtype); + digest_obj = _gvn.transform(digest_obj); Node* state; if (long_state) { - state = get_state_from_sha5_object(sha_obj); + state = get_long_state_from_digest_object(digest_obj); } else { - state = get_state_from_sha_object(sha_obj); + state = get_state_from_digest_object(digest_obj); } if (state == NULL) return false; @@ -6937,37 +6954,37 @@ bool LibraryCallKit::inline_sha_implCompressMB(Node* digestBase_obj, ciInstanceK return true; } -//------------------------------get_state_from_sha_object----------------------- -Node * LibraryCallKit::get_state_from_sha_object(Node *sha_object) { - Node* sha_state = load_field_from_object(sha_object, "state", "[I", /*is_exact*/ false); - assert (sha_state != NULL, "wrong version of sun.security.provider.SHA/SHA2"); - if (sha_state == NULL) return (Node *) NULL; +//------------------------------get_state_from_digest_object----------------------- +Node * LibraryCallKit::get_state_from_digest_object(Node *digest_object) { + Node* digest_state = load_field_from_object(digest_object, "state", "[I", /*is_exact*/ false); + assert (digest_state != NULL, "wrong version of sun.security.provider.MD5/SHA/SHA2"); + if (digest_state == NULL) return (Node *) NULL; // now have the array, need to get the start address of the state array - Node* state = array_element_address(sha_state, intcon(0), T_INT); + Node* state = array_element_address(digest_state, intcon(0), T_INT); return state; } -//------------------------------get_state_from_sha5_object----------------------- -Node * LibraryCallKit::get_state_from_sha5_object(Node *sha_object) { - Node* sha_state = load_field_from_object(sha_object, "state", "[J", /*is_exact*/ false); - assert (sha_state != NULL, "wrong version of sun.security.provider.SHA5"); - if (sha_state == NULL) return (Node *) NULL; +//------------------------------get_long_state_from_digest_object----------------------- +Node * LibraryCallKit::get_long_state_from_digest_object(Node *digest_object) { + Node* digest_state = load_field_from_object(digest_object, "state", "[J", /*is_exact*/ false); + assert (digest_state != NULL, "wrong version of sun.security.provider.SHA5"); + if (digest_state == NULL) return (Node *) NULL; // now have the array, need to get the start address of the state array - Node* state = array_element_address(sha_state, intcon(0), T_LONG); + Node* state = array_element_address(digest_state, intcon(0), T_LONG); return state; } //----------------------------inline_digestBase_implCompressMB_predicate---------------------------- // Return node representing slow path of predicate check. // the pseudo code we want to emulate with this predicate is: -// if (digestBaseObj instanceof SHA/SHA2/SHA5) do_intrinsic, else do_javapath +// if (digestBaseObj instanceof MD5/SHA/SHA2/SHA5) do_intrinsic, else do_javapath // Node* LibraryCallKit::inline_digestBase_implCompressMB_predicate(int predicate) { - assert(UseSHA1Intrinsics || UseSHA256Intrinsics || UseSHA512Intrinsics, - "need SHA1/SHA256/SHA512 instruction support"); - assert((uint)predicate < 3, "sanity"); + assert(UseMD5Intrinsics || UseSHA1Intrinsics || UseSHA256Intrinsics || UseSHA512Intrinsics, + "need MD5/SHA1/SHA256/SHA512 instruction support"); + assert((uint)predicate < 4, "sanity"); // The receiver was checked for NULL already. Node* digestBaseObj = argument(0); @@ -6977,44 +6994,50 @@ Node* LibraryCallKit::inline_digestBase_implCompressMB_predicate(int predicate) assert(tinst != NULL, "digestBaseObj is null"); assert(tinst->klass()->is_loaded(), "DigestBase is not loaded"); - const char* klass_SHA_name = NULL; + const char* klass_name = NULL; switch (predicate) { case 0: + if (UseMD5Intrinsics) { + // we want to do an instanceof comparison against the MD5 class + klass_name = "sun/security/provider/MD5"; + } + break; + case 1: if (UseSHA1Intrinsics) { // we want to do an instanceof comparison against the SHA class - klass_SHA_name = "sun/security/provider/SHA"; + klass_name = "sun/security/provider/SHA"; } break; - case 1: + case 2: if (UseSHA256Intrinsics) { // we want to do an instanceof comparison against the SHA2 class - klass_SHA_name = "sun/security/provider/SHA2"; + klass_name = "sun/security/provider/SHA2"; } break; - case 2: + case 3: if (UseSHA512Intrinsics) { // we want to do an instanceof comparison against the SHA5 class - klass_SHA_name = "sun/security/provider/SHA5"; + klass_name = "sun/security/provider/SHA5"; } break; default: fatal(err_msg_res("unknown SHA intrinsic predicate: %d", predicate)); } - ciKlass* klass_SHA = NULL; - if (klass_SHA_name != NULL) { - klass_SHA = tinst->klass()->as_instance_klass()->find_klass(ciSymbol::make(klass_SHA_name)); + ciKlass* klass = NULL; + if (klass_name != NULL) { + klass = tinst->klass()->as_instance_klass()->find_klass(ciSymbol::make(klass_name)); } - if ((klass_SHA == NULL) || !klass_SHA->is_loaded()) { - // if none of SHA/SHA2/SHA5 is loaded, we never take the intrinsic fast path + if ((klass == NULL) || !klass->is_loaded()) { + // if none of MD5/SHA/SHA2/SHA5 is loaded, we never take the intrinsic fast path Node* ctrl = control(); set_control(top()); // no intrinsic path return ctrl; } - ciInstanceKlass* instklass_SHA = klass_SHA->as_instance_klass(); + ciInstanceKlass* instklass = klass->as_instance_klass(); - Node* instofSHA = gen_instanceof(digestBaseObj, makecon(TypeKlassPtr::make(instklass_SHA))); - Node* cmp_instof = _gvn.transform(new (C) CmpINode(instofSHA, intcon(1))); + Node* instof = gen_instanceof(digestBaseObj, makecon(TypeKlassPtr::make(instklass))); + Node* cmp_instof = _gvn.transform(new (C) CmpINode(instof, intcon(1))); Node* bool_instof = _gvn.transform(new (C) BoolNode(cmp_instof, BoolTest::ne)); Node* instof_false = generate_guard(bool_instof, NULL, PROB_MIN); diff --git a/hotspot/src/share/vm/opto/runtime.cpp b/hotspot/src/share/vm/opto/runtime.cpp index 1c51be19b..468846ee8 100644 --- a/hotspot/src/share/vm/opto/runtime.cpp +++ b/hotspot/src/share/vm/opto/runtime.cpp @@ -1053,7 +1053,7 @@ const TypeFunc* OptoRuntime::counterMode_aescrypt_Type() { /* * void implCompress(byte[] buf, int ofs) */ -const TypeFunc* OptoRuntime::sha_implCompress_Type() { +const TypeFunc* OptoRuntime::digestBase_implCompress_Type() { // create input type (domain) int num_args = 2; int argcnt = num_args; diff --git a/hotspot/src/share/vm/opto/runtime.hpp b/hotspot/src/share/vm/opto/runtime.hpp index f27e7d507..3f786d304 100644 --- a/hotspot/src/share/vm/opto/runtime.hpp +++ b/hotspot/src/share/vm/opto/runtime.hpp @@ -301,7 +301,7 @@ private: static const TypeFunc* cipherBlockChaining_aescrypt_Type(); static const TypeFunc* counterMode_aescrypt_Type(); - static const TypeFunc* sha_implCompress_Type(); + static const TypeFunc* digestBase_implCompress_Type(); static const TypeFunc* digestBase_implCompressMB_Type(); static const TypeFunc* multiplyToLen_Type(); diff --git a/hotspot/src/share/vm/runtime/globals.hpp b/hotspot/src/share/vm/runtime/globals.hpp index ac9165031..179fad2da 100644 --- a/hotspot/src/share/vm/runtime/globals.hpp +++ b/hotspot/src/share/vm/runtime/globals.hpp @@ -750,6 +750,9 @@ class CommandLineFlags { product(bool, UseAESIntrinsics, false, \ "Use intrinsics for AES versions of crypto") \ \ + diagnostic(bool, UseMD5Intrinsics, false, \ + "Use intrinsics for MD5 crypto hash function") \ + \ product(bool, UseAESCTRIntrinsics, false, \ "Use intrinsics for the paralleled version of AES/CTR crypto") \ \ diff --git a/hotspot/src/share/vm/runtime/stubRoutines.cpp b/hotspot/src/share/vm/runtime/stubRoutines.cpp index d66237137..3cee9c224 100644 --- a/hotspot/src/share/vm/runtime/stubRoutines.cpp +++ b/hotspot/src/share/vm/runtime/stubRoutines.cpp @@ -127,6 +127,8 @@ address StubRoutines::_cipherBlockChaining_decryptAESCrypt = NULL; address StubRoutines::_counterMode_AESCrypt = NULL; address StubRoutines::_ghash_processBlocks = NULL; +address StubRoutines::_md5_implCompress = NULL; +address StubRoutines::_md5_implCompressMB = NULL; address StubRoutines::_sha1_implCompress = NULL; address StubRoutines::_sha1_implCompressMB = NULL; address StubRoutines::_sha256_implCompress = NULL; diff --git a/hotspot/src/share/vm/runtime/stubRoutines.hpp b/hotspot/src/share/vm/runtime/stubRoutines.hpp index 9fb589540..fff13dbcb 100644 --- a/hotspot/src/share/vm/runtime/stubRoutines.hpp +++ b/hotspot/src/share/vm/runtime/stubRoutines.hpp @@ -205,6 +205,8 @@ class StubRoutines: AllStatic { static address _counterMode_AESCrypt; static address _ghash_processBlocks; + static address _md5_implCompress; + static address _md5_implCompressMB; static address _sha1_implCompress; static address _sha1_implCompressMB; static address _sha256_implCompress; @@ -374,6 +376,8 @@ class StubRoutines: AllStatic { static address counterMode_AESCrypt() { return _counterMode_AESCrypt; } static address ghash_processBlocks() { return _ghash_processBlocks; } + static address md5_implCompress() { return _md5_implCompress; } + static address md5_implCompressMB() { return _md5_implCompressMB; } static address sha1_implCompress() { return _sha1_implCompress; } static address sha1_implCompressMB() { return _sha1_implCompressMB; } static address sha256_implCompress() { return _sha256_implCompress; } diff --git a/hotspot/test/compiler/intrinsics/sha/TestSHA.java b/hotspot/test/compiler/intrinsics/sha/TestDigest.java similarity index 53% rename from hotspot/test/compiler/intrinsics/sha/TestSHA.java rename to hotspot/test/compiler/intrinsics/sha/TestDigest.java index 08af909ee..5477c72e2 100644 --- a/hotspot/test/compiler/intrinsics/sha/TestSHA.java +++ b/hotspot/test/compiler/intrinsics/sha/TestDigest.java @@ -1,5 +1,6 @@ /* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, Huawei Technologies Co., Ltd. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -19,38 +20,75 @@ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. - * */ /** * @test * @bug 8035968 - * @summary C2 support for SHA on SPARC + * @summary C2 support for MD5/SHA-1/SHA-224/SHA-256/SHA-384/SHA-512 * - * @run main/othervm/timeout=600 -Xbatch -Dalgorithm=SHA-1 TestSHA - * @run main/othervm/timeout=600 -Xbatch -Dalgorithm=SHA-224 TestSHA - * @run main/othervm/timeout=600 -Xbatch -Dalgorithm=SHA-256 TestSHA - * @run main/othervm/timeout=600 -Xbatch -Dalgorithm=SHA-384 TestSHA - * @run main/othervm/timeout=600 -Xbatch -Dalgorithm=SHA-512 TestSHA + * @run main/othervm/timeout=600 -Xbatch + * -Dalgorithm=MD5 + * compiler.intrinsics.sha.TestDigest + * @run main/othervm/timeout=600 -Xbatch + * -Dalgorithm=SHA-1 + * compiler.intrinsics.sha.TestDigest + * @run main/othervm/timeout=600 -Xbatch + * -Dalgorithm=SHA-224 + * compiler.intrinsics.sha.TestDigest + * @run main/othervm/timeout=600 -Xbatch + * -Dalgorithm=SHA-256 + * compiler.intrinsics.sha.TestDigest + * @run main/othervm/timeout=600 -Xbatch + * -Dalgorithm=SHA-384 + * compiler.intrinsics.sha.TestDigest + * @run main/othervm/timeout=600 -Xbatch + * -Dalgorithm=SHA-512 + * compiler.intrinsics.sha.TestDigest * - * @run main/othervm/timeout=600 -Xbatch -Dalgorithm=SHA-1 -Doffset=1 TestSHA - * @run main/othervm/timeout=600 -Xbatch -Dalgorithm=SHA-224 -Doffset=1 TestSHA - * @run main/othervm/timeout=600 -Xbatch -Dalgorithm=SHA-256 -Doffset=1 TestSHA - * @run main/othervm/timeout=600 -Xbatch -Dalgorithm=SHA-384 -Doffset=1 TestSHA - * @run main/othervm/timeout=600 -Xbatch -Dalgorithm=SHA-512 -Doffset=1 TestSHA + * @run main/othervm/timeout=600 -Xbatch + * -Dalgorithm=MD5 -Doffset=1 + * compiler.intrinsics.sha.TestDigest + * @run main/othervm/timeout=600 -Xbatch + * -Dalgorithm=SHA-1 -Doffset=1 + * compiler.intrinsics.sha.TestDigest + * @run main/othervm/timeout=600 -Xbatch + * -Dalgorithm=SHA-224 -Doffset=1 + * compiler.intrinsics.sha.TestDigest + * @run main/othervm/timeout=600 -Xbatch + * -Dalgorithm=SHA-256 -Doffset=1 + * compiler.intrinsics.sha.TestDigest + * @run main/othervm/timeout=600 -Xbatch + * -Dalgorithm=SHA-384 -Doffset=1 + * compiler.intrinsics.sha.TestDigest + * @run main/othervm/timeout=600 -Xbatch + * -Dalgorithm=SHA-512 -Doffset=1 + * compiler.intrinsics.sha.TestDigest * - * @run main/othervm/timeout=600 -Xbatch -Dalgorithm=SHA-1 -Dalgorithm2=SHA-256 TestSHA - * @run main/othervm/timeout=600 -Xbatch -Dalgorithm=SHA-1 -Dalgorithm2=SHA-512 TestSHA - * @run main/othervm/timeout=600 -Xbatch -Dalgorithm=SHA-256 -Dalgorithm2=SHA-512 TestSHA + * @run main/othervm/timeout=600 -Xbatch + * -Dalgorithm=SHA-1 -Dalgorithm2=SHA-256 + * compiler.intrinsics.sha.TestDigest + * @run main/othervm/timeout=600 -Xbatch + * -Dalgorithm=SHA-1 -Dalgorithm2=SHA-512 + * compiler.intrinsics.sha.TestDigest + * @run main/othervm/timeout=600 -Xbatch + * -Dalgorithm=SHA-256 -Dalgorithm2=SHA-512 + * compiler.intrinsics.sha.TestDigest * - * @run main/othervm/timeout=600 -Xbatch -Dalgorithm=SHA-1 -Dalgorithm2=MD5 TestSHA - * @run main/othervm/timeout=600 -Xbatch -Dalgorithm=MD5 -Dalgorithm2=SHA-1 TestSHA + * @run main/othervm/timeout=600 -Xbatch + * -Dalgorithm=SHA-1 -Dalgorithm2=MD5 + * compiler.intrinsics.sha.TestDigest + * @run main/othervm/timeout=600 -Xbatch + * -Dalgorithm=MD5 -Dalgorithm2=SHA-1 + * compiler.intrinsics.sha.TestDigest */ +package compiler.intrinsics.sha; + import java.security.MessageDigest; import java.util.Arrays; -public class TestSHA { +public class TestDigest { private static final int HASH_LEN = 64; /* up to 512-bit */ private static final int ALIGN = 8; /* for different data alignments */ @@ -63,14 +101,14 @@ public class TestSHA { int iters = (args.length > 0 ? Integer.valueOf(args[0]) : 100000); int warmupIters = (args.length > 1 ? Integer.valueOf(args[1]) : 20000); - testSHA(provider, algorithm, msgSize, offset, iters, warmupIters); + testDigest(provider, algorithm, msgSize, offset, iters, warmupIters); if (algorithm2.equals("") == false) { - testSHA(provider, algorithm2, msgSize, offset, iters, warmupIters); + testDigest(provider, algorithm2, msgSize, offset, iters, warmupIters); } } - static void testSHA(String provider, String algorithm, int msgSize, + public static void testDigest(String provider, String algorithm, int msgSize, int offset, int iters, int warmupIters) throws Exception { System.out.println("provider = " + provider); System.out.println("algorithm = " + algorithm); @@ -86,27 +124,27 @@ public class TestSHA { } try { - MessageDigest sha = MessageDigest.getInstance(algorithm, provider); + MessageDigest digest = MessageDigest.getInstance(algorithm, provider); /* do once, which doesn't use intrinsics */ - sha.reset(); - sha.update(data, offset, msgSize); - expectedHash = sha.digest(); + digest.reset(); + digest.update(data, offset, msgSize); + expectedHash = digest.digest(); /* warm up */ for (int i = 0; i < warmupIters; i++) { - sha.reset(); - sha.update(data, offset, msgSize); - hash = sha.digest(); + digest.reset(); + digest.update(data, offset, msgSize); + hash = digest.digest(); } /* check result */ if (Arrays.equals(hash, expectedHash) == false) { - System.out.println("TestSHA Error: "); + System.out.println("TestDigest Error: "); showArray(expectedHash, "expectedHash"); showArray(hash, "computedHash"); //System.exit(1); - throw new Exception("TestSHA Error"); + throw new Exception("TestDigest Error"); } else { showArray(hash, "hash"); } @@ -114,15 +152,15 @@ public class TestSHA { /* measure performance */ long start = System.nanoTime(); for (int i = 0; i < iters; i++) { - sha.reset(); - sha.update(data, offset, msgSize); - hash = sha.digest(); + digest.reset(); + digest.update(data, offset, msgSize); + hash = digest.digest(); } long end = System.nanoTime(); double total = (double)(end - start)/1e9; /* in seconds */ double thruput = (double)msgSize*iters/1e6/total; /* in MB/s */ - System.out.println("TestSHA runtime = " + total + " seconds"); - System.out.println("TestSHA throughput = " + thruput + " MB/s"); + System.out.println("TestDigest runtime = " + total + " seconds"); + System.out.println("TestDigest throughput = " + thruput + " MB/s"); System.out.println(); } catch (Exception e) { System.out.println("Exception: " + e); diff --git a/hotspot/test/compiler/intrinsics/sha/cli/SHAOptionsBase.java b/hotspot/test/compiler/intrinsics/sha/cli/DigestOptionsBase.java similarity index 55% rename from hotspot/test/compiler/intrinsics/sha/cli/SHAOptionsBase.java rename to hotspot/test/compiler/intrinsics/sha/cli/DigestOptionsBase.java index 80a1131ec..109687a1d 100644 --- a/hotspot/test/compiler/intrinsics/sha/cli/SHAOptionsBase.java +++ b/hotspot/test/compiler/intrinsics/sha/cli/DigestOptionsBase.java @@ -1,5 +1,6 @@ /* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, Huawei Technologies Co., Ltd. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -33,29 +34,34 @@ import java.util.function.BooleanSupplier; * Instead of using huge complex tests for each option, each test is constructed * from several test cases shared among different tests. */ -public class SHAOptionsBase extends CommandLineOptionTest { - protected static final String USE_SHA_OPTION = "UseSHA"; - protected static final String USE_SHA1_INTRINSICS_OPTION +public class DigestOptionsBase extends CommandLineOptionTest { + public static final String USE_MD5_INTRINSICS_OPTION + = "UseMD5Intrinsics"; + public static final String USE_SHA_OPTION = "UseSHA"; + public static final String USE_SHA1_INTRINSICS_OPTION = "UseSHA1Intrinsics"; - protected static final String USE_SHA256_INTRINSICS_OPTION + public static final String USE_SHA256_INTRINSICS_OPTION = "UseSHA256Intrinsics"; - protected static final String USE_SHA512_INTRINSICS_OPTION + public static final String USE_SHA512_INTRINSICS_OPTION = "UseSHA512Intrinsics"; + // Intrinsics flags are of diagnostic type + // and must be preceded by UnlockDiagnosticVMOptions. + public static final String UNLOCK_DIAGNOSTIC_VM_OPTIONS + = "-XX:+UnlockDiagnosticVMOptions"; + // Note that strings below will be passed to // CommandLineOptionTest.verifySameJVMStartup and thus are regular // expressions, not just a plain strings. + protected static final String MD5_INTRINSICS_ARE_NOT_AVAILABLE + = "MD5 intrinsics are not available on this CPU"; protected static final String SHA_INSTRUCTIONS_ARE_NOT_AVAILABLE = "SHA instructions are not available on this CPU"; - protected static final String SHA1_INSTRUCTION_IS_NOT_AVAILABLE - = "SHA1 instruction is not available on this CPU\\."; - protected static final String SHA256_INSTRUCTION_IS_NOT_AVAILABLE - = "SHA256 instruction \\(for SHA-224 and SHA-256\\) " - + "is not available on this CPU\\."; - protected static final String SHA512_INSTRUCTION_IS_NOT_AVAILABLE - = "SHA512 instruction \\(for SHA-384 and SHA-512\\) " - + "is not available on this CPU\\."; - protected static final String SHA_INTRINSICS_ARE_NOT_AVAILABLE + protected static final String SHA1_INTRINSICS_ARE_NOT_AVAILABLE + = "SHA intrinsics are not available on this CPU"; + protected static final String SHA256_INTRINSICS_ARE_NOT_AVAILABLE + = "SHA intrinsics are not available on this CPU"; + protected static final String SHA512_INTRINSICS_ARE_NOT_AVAILABLE = "SHA intrinsics are not available on this CPU"; private final TestCase[] testCases; @@ -70,47 +76,20 @@ public class SHAOptionsBase extends CommandLineOptionTest { * @return A warning message that will be printed out to VM output if CPU * instructions required by the option are not supported. */ - protected static String getWarningForUnsupportedCPU(String optionName) { - if (Platform.isSparc()) { - switch (optionName) { - case SHAOptionsBase.USE_SHA_OPTION: - return SHAOptionsBase.SHA_INSTRUCTIONS_ARE_NOT_AVAILABLE; - case SHAOptionsBase.USE_SHA1_INTRINSICS_OPTION: - return SHAOptionsBase.SHA1_INSTRUCTION_IS_NOT_AVAILABLE; - case SHAOptionsBase.USE_SHA256_INTRINSICS_OPTION: - return SHAOptionsBase.SHA256_INSTRUCTION_IS_NOT_AVAILABLE; - case SHAOptionsBase.USE_SHA512_INTRINSICS_OPTION: - return SHAOptionsBase.SHA512_INSTRUCTION_IS_NOT_AVAILABLE; - default: - throw new Error("Unexpected option " + optionName); - } - } else if (Platform.isX64() || Platform.isX86()) { - switch (optionName) { - case SHAOptionsBase.USE_SHA_OPTION: - return SHAOptionsBase.SHA_INSTRUCTIONS_ARE_NOT_AVAILABLE; - case SHAOptionsBase.USE_SHA1_INTRINSICS_OPTION: - case SHAOptionsBase.USE_SHA256_INTRINSICS_OPTION: - case SHAOptionsBase.USE_SHA512_INTRINSICS_OPTION: - return SHAOptionsBase.SHA_INTRINSICS_ARE_NOT_AVAILABLE; - default: - throw new Error("Unexpected option " + optionName); - } - } else if (Platform.isAArch64()) { - switch (optionName) { - case SHAOptionsBase.USE_SHA_OPTION: - return SHAOptionsBase.SHA_INSTRUCTIONS_ARE_NOT_AVAILABLE; - case SHAOptionsBase.USE_SHA1_INTRINSICS_OPTION: - return SHAOptionsBase.SHA1_INSTRUCTION_IS_NOT_AVAILABLE; - case SHAOptionsBase.USE_SHA256_INTRINSICS_OPTION: - return SHAOptionsBase.SHA256_INSTRUCTION_IS_NOT_AVAILABLE; - case SHAOptionsBase.USE_SHA512_INTRINSICS_OPTION: - return SHAOptionsBase.SHA512_INSTRUCTION_IS_NOT_AVAILABLE; - default: - throw new Error("Unexpected option " + optionName); - } - } else { - throw new Error("Support for CPUs other then X86 or SPARC is not " - + "implemented."); + public static String getWarningForUnsupportedCPU(String optionName) { + switch (optionName) { + case DigestOptionsBase.USE_MD5_INTRINSICS_OPTION: + return DigestOptionsBase.MD5_INTRINSICS_ARE_NOT_AVAILABLE; + case DigestOptionsBase.USE_SHA_OPTION: + return DigestOptionsBase.SHA_INSTRUCTIONS_ARE_NOT_AVAILABLE; + case DigestOptionsBase.USE_SHA1_INTRINSICS_OPTION: + return DigestOptionsBase.SHA1_INTRINSICS_ARE_NOT_AVAILABLE; + case DigestOptionsBase.USE_SHA256_INTRINSICS_OPTION: + return DigestOptionsBase.SHA256_INTRINSICS_ARE_NOT_AVAILABLE; + case DigestOptionsBase.USE_SHA512_INTRINSICS_OPTION: + return DigestOptionsBase.SHA512_INTRINSICS_ARE_NOT_AVAILABLE; + default: + throw new Error("Unexpected option " + optionName); } } @@ -123,22 +102,24 @@ public class SHAOptionsBase extends CommandLineOptionTest { * @return The predicate on availability of CPU instructions required by the * option. */ - protected static BooleanSupplier getPredicateForOption(String optionName) { + public static BooleanSupplier getPredicateForOption(String optionName) { switch (optionName) { - case SHAOptionsBase.USE_SHA_OPTION: + case DigestOptionsBase.USE_MD5_INTRINSICS_OPTION: + return IntrinsicPredicates.MD5_INSTRUCTION_AVAILABLE; + case DigestOptionsBase.USE_SHA_OPTION: return IntrinsicPredicates.ANY_SHA_INSTRUCTION_AVAILABLE; - case SHAOptionsBase.USE_SHA1_INTRINSICS_OPTION: + case DigestOptionsBase.USE_SHA1_INTRINSICS_OPTION: return IntrinsicPredicates.SHA1_INSTRUCTION_AVAILABLE; - case SHAOptionsBase.USE_SHA256_INTRINSICS_OPTION: + case DigestOptionsBase.USE_SHA256_INTRINSICS_OPTION: return IntrinsicPredicates.SHA256_INSTRUCTION_AVAILABLE; - case SHAOptionsBase.USE_SHA512_INTRINSICS_OPTION: + case DigestOptionsBase.USE_SHA512_INTRINSICS_OPTION: return IntrinsicPredicates.SHA512_INSTRUCTION_AVAILABLE; default: throw new Error("Unexpected option " + optionName); } } - public SHAOptionsBase(TestCase... testCases) { + public DigestOptionsBase(TestCase... testCases) { super(Boolean.TRUE::booleanValue); this.testCases = testCases; } diff --git a/hotspot/test/compiler/intrinsics/sha/cli/TestUseMD5IntrinsicsOptionOnSupportedCPU.java b/hotspot/test/compiler/intrinsics/sha/cli/TestUseMD5IntrinsicsOptionOnSupportedCPU.java new file mode 100644 index 000000000..93b6cf6ec --- /dev/null +++ b/hotspot/test/compiler/intrinsics/sha/cli/TestUseMD5IntrinsicsOptionOnSupportedCPU.java @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, Huawei Technologies Co., Ltd. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/** + * @test + * @bug 8035968 + * @summary Verify UseMD5Intrinsics option processing on supported CPU. + * @library /testlibrary /testlibrary/whitebox /compiler/testlibrary testcases + * @modules java.base/jdk.internal.misc + * java.management + * + * @build TestUseMD5IntrinsicsOptionOnSupportedCPU + * @run main ClassFileInstaller sun.hotspot.WhiteBox + * sun.hotspot.WhiteBox$WhiteBoxPermission + * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions + * -XX:+WhiteBoxAPI + * TestUseMD5IntrinsicsOptionOnSupportedCPU + */ + +public class TestUseMD5IntrinsicsOptionOnSupportedCPU { + public static void main(String args[]) throws Throwable { + new DigestOptionsBase(new GenericTestCaseForSupportedSparcCPU( + DigestOptionsBase.USE_MD5_INTRINSICS_OPTION)).test(); + } +} diff --git a/hotspot/test/compiler/intrinsics/sha/cli/TestUseMD5IntrinsicsOptionOnUnsupportedCPU.java b/hotspot/test/compiler/intrinsics/sha/cli/TestUseMD5IntrinsicsOptionOnUnsupportedCPU.java new file mode 100644 index 000000000..6851b0b86 --- /dev/null +++ b/hotspot/test/compiler/intrinsics/sha/cli/TestUseMD5IntrinsicsOptionOnUnsupportedCPU.java @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, Huawei Technologies Co., Ltd. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/** + * @test + * @bug 8035968 + * @summary Verify UseMD5Intrinsics option processing on unsupported CPU. + * @library /testlibrary /testlibrary/whitebox /compiler/testlibrary testcases + * @modules java.base/jdk.internal.misc + * java.management + * + * @build TestUseMD5IntrinsicsOptionOnUnsupportedCPU + * @run main ClassFileInstaller sun.hotspot.WhiteBox + * sun.hotspot.WhiteBox$WhiteBoxPermission + * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions + * -XX:+WhiteBoxAPI + * TestUseMD5IntrinsicsOptionOnUnsupportedCPU + */ + +public class TestUseMD5IntrinsicsOptionOnUnsupportedCPU { + public static void main(String args[]) throws Throwable { + new DigestOptionsBase( + new GenericTestCaseForUnsupportedX86CPU( + DigestOptionsBase.USE_MD5_INTRINSICS_OPTION), + new GenericTestCaseForUnsupportedAArch64CPU( + DigestOptionsBase.USE_MD5_INTRINSICS_OPTION), + new GenericTestCaseForOtherCPU( + DigestOptionsBase.USE_MD5_INTRINSICS_OPTION)).test(); + } +} diff --git a/hotspot/test/compiler/intrinsics/sha/cli/TestUseSHA1IntrinsicsOptionOnSupportedCPU.java b/hotspot/test/compiler/intrinsics/sha/cli/TestUseSHA1IntrinsicsOptionOnSupportedCPU.java index 9eb23d3b8..c79fbf285 100644 --- a/hotspot/test/compiler/intrinsics/sha/cli/TestUseSHA1IntrinsicsOptionOnSupportedCPU.java +++ b/hotspot/test/compiler/intrinsics/sha/cli/TestUseSHA1IntrinsicsOptionOnSupportedCPU.java @@ -34,10 +34,10 @@ */ public class TestUseSHA1IntrinsicsOptionOnSupportedCPU { public static void main(String args[]) throws Throwable { - new SHAOptionsBase( + new DigestOptionsBase( new GenericTestCaseForSupportedSparcCPU( - SHAOptionsBase.USE_SHA1_INTRINSICS_OPTION), + DigestOptionsBase.USE_SHA1_INTRINSICS_OPTION), new GenericTestCaseForSupportedAArch64CPU( - SHAOptionsBase.USE_SHA1_INTRINSICS_OPTION)).test(); + DigestOptionsBase.USE_SHA1_INTRINSICS_OPTION)).test(); } } diff --git a/hotspot/test/compiler/intrinsics/sha/cli/TestUseSHA1IntrinsicsOptionOnUnsupportedCPU.java b/hotspot/test/compiler/intrinsics/sha/cli/TestUseSHA1IntrinsicsOptionOnUnsupportedCPU.java index 972f7b5c1..0673913cb 100644 --- a/hotspot/test/compiler/intrinsics/sha/cli/TestUseSHA1IntrinsicsOptionOnUnsupportedCPU.java +++ b/hotspot/test/compiler/intrinsics/sha/cli/TestUseSHA1IntrinsicsOptionOnUnsupportedCPU.java @@ -35,16 +35,16 @@ */ public class TestUseSHA1IntrinsicsOptionOnUnsupportedCPU { public static void main(String args[]) throws Throwable { - new SHAOptionsBase( + new DigestOptionsBase( new GenericTestCaseForUnsupportedSparcCPU( - SHAOptionsBase.USE_SHA1_INTRINSICS_OPTION), + DigestOptionsBase.USE_SHA1_INTRINSICS_OPTION), new UseSHAIntrinsicsSpecificTestCaseForUnsupportedSparcCPU( - SHAOptionsBase.USE_SHA1_INTRINSICS_OPTION), + DigestOptionsBase.USE_SHA1_INTRINSICS_OPTION), new GenericTestCaseForUnsupportedAArch64CPU( - SHAOptionsBase.USE_SHA1_INTRINSICS_OPTION), + DigestOptionsBase.USE_SHA1_INTRINSICS_OPTION), new GenericTestCaseForUnsupportedX86CPU( - SHAOptionsBase.USE_SHA1_INTRINSICS_OPTION), + DigestOptionsBase.USE_SHA1_INTRINSICS_OPTION), new GenericTestCaseForOtherCPU( - SHAOptionsBase.USE_SHA1_INTRINSICS_OPTION)).test(); + DigestOptionsBase.USE_SHA1_INTRINSICS_OPTION)).test(); } } diff --git a/hotspot/test/compiler/intrinsics/sha/cli/TestUseSHA256IntrinsicsOptionOnSupportedCPU.java b/hotspot/test/compiler/intrinsics/sha/cli/TestUseSHA256IntrinsicsOptionOnSupportedCPU.java index ac11f1456..172e046c3 100644 --- a/hotspot/test/compiler/intrinsics/sha/cli/TestUseSHA256IntrinsicsOptionOnSupportedCPU.java +++ b/hotspot/test/compiler/intrinsics/sha/cli/TestUseSHA256IntrinsicsOptionOnSupportedCPU.java @@ -35,10 +35,10 @@ */ public class TestUseSHA256IntrinsicsOptionOnSupportedCPU { public static void main(String args[]) throws Throwable { - new SHAOptionsBase( + new DigestOptionsBase( new GenericTestCaseForSupportedSparcCPU( - SHAOptionsBase.USE_SHA256_INTRINSICS_OPTION), + DigestOptionsBase.USE_SHA256_INTRINSICS_OPTION), new GenericTestCaseForSupportedAArch64CPU( - SHAOptionsBase.USE_SHA256_INTRINSICS_OPTION)).test(); + DigestOptionsBase.USE_SHA256_INTRINSICS_OPTION)).test(); } } diff --git a/hotspot/test/compiler/intrinsics/sha/cli/TestUseSHA256IntrinsicsOptionOnUnsupportedCPU.java b/hotspot/test/compiler/intrinsics/sha/cli/TestUseSHA256IntrinsicsOptionOnUnsupportedCPU.java index 94ce52ea9..0abe91d14 100644 --- a/hotspot/test/compiler/intrinsics/sha/cli/TestUseSHA256IntrinsicsOptionOnUnsupportedCPU.java +++ b/hotspot/test/compiler/intrinsics/sha/cli/TestUseSHA256IntrinsicsOptionOnUnsupportedCPU.java @@ -35,16 +35,16 @@ */ public class TestUseSHA256IntrinsicsOptionOnUnsupportedCPU { public static void main(String args[]) throws Throwable { - new SHAOptionsBase( + new DigestOptionsBase( new GenericTestCaseForUnsupportedSparcCPU( - SHAOptionsBase.USE_SHA256_INTRINSICS_OPTION), + DigestOptionsBase.USE_SHA256_INTRINSICS_OPTION), new UseSHAIntrinsicsSpecificTestCaseForUnsupportedSparcCPU( - SHAOptionsBase.USE_SHA256_INTRINSICS_OPTION), + DigestOptionsBase.USE_SHA256_INTRINSICS_OPTION), new GenericTestCaseForUnsupportedAArch64CPU( - SHAOptionsBase.USE_SHA256_INTRINSICS_OPTION), + DigestOptionsBase.USE_SHA256_INTRINSICS_OPTION), new GenericTestCaseForUnsupportedX86CPU( - SHAOptionsBase.USE_SHA256_INTRINSICS_OPTION), + DigestOptionsBase.USE_SHA256_INTRINSICS_OPTION), new GenericTestCaseForOtherCPU( - SHAOptionsBase.USE_SHA256_INTRINSICS_OPTION)).test(); + DigestOptionsBase.USE_SHA256_INTRINSICS_OPTION)).test(); } } diff --git a/hotspot/test/compiler/intrinsics/sha/cli/TestUseSHA512IntrinsicsOptionOnSupportedCPU.java b/hotspot/test/compiler/intrinsics/sha/cli/TestUseSHA512IntrinsicsOptionOnSupportedCPU.java index 65c8236d4..ce1c31cbb 100644 --- a/hotspot/test/compiler/intrinsics/sha/cli/TestUseSHA512IntrinsicsOptionOnSupportedCPU.java +++ b/hotspot/test/compiler/intrinsics/sha/cli/TestUseSHA512IntrinsicsOptionOnSupportedCPU.java @@ -35,10 +35,10 @@ */ public class TestUseSHA512IntrinsicsOptionOnSupportedCPU { public static void main(String args[]) throws Throwable { - new SHAOptionsBase( + new DigestOptionsBase( new GenericTestCaseForSupportedSparcCPU( - SHAOptionsBase.USE_SHA512_INTRINSICS_OPTION), + DigestOptionsBase.USE_SHA512_INTRINSICS_OPTION), new GenericTestCaseForSupportedAArch64CPU( - SHAOptionsBase.USE_SHA512_INTRINSICS_OPTION)).test(); + DigestOptionsBase.USE_SHA512_INTRINSICS_OPTION)).test(); } } diff --git a/hotspot/test/compiler/intrinsics/sha/cli/TestUseSHA512IntrinsicsOptionOnUnsupportedCPU.java b/hotspot/test/compiler/intrinsics/sha/cli/TestUseSHA512IntrinsicsOptionOnUnsupportedCPU.java index d3c94ee0f..fa0053a3e 100644 --- a/hotspot/test/compiler/intrinsics/sha/cli/TestUseSHA512IntrinsicsOptionOnUnsupportedCPU.java +++ b/hotspot/test/compiler/intrinsics/sha/cli/TestUseSHA512IntrinsicsOptionOnUnsupportedCPU.java @@ -35,16 +35,16 @@ */ public class TestUseSHA512IntrinsicsOptionOnUnsupportedCPU { public static void main(String args[]) throws Throwable { - new SHAOptionsBase( + new DigestOptionsBase( new GenericTestCaseForUnsupportedSparcCPU( - SHAOptionsBase.USE_SHA512_INTRINSICS_OPTION), + DigestOptionsBase.USE_SHA512_INTRINSICS_OPTION), new UseSHAIntrinsicsSpecificTestCaseForUnsupportedSparcCPU( - SHAOptionsBase.USE_SHA512_INTRINSICS_OPTION), + DigestOptionsBase.USE_SHA512_INTRINSICS_OPTION), new GenericTestCaseForUnsupportedAArch64CPU( - SHAOptionsBase.USE_SHA512_INTRINSICS_OPTION), + DigestOptionsBase.USE_SHA512_INTRINSICS_OPTION), new GenericTestCaseForUnsupportedX86CPU( - SHAOptionsBase.USE_SHA512_INTRINSICS_OPTION), + DigestOptionsBase.USE_SHA512_INTRINSICS_OPTION), new GenericTestCaseForOtherCPU( - SHAOptionsBase.USE_SHA512_INTRINSICS_OPTION)).test(); + DigestOptionsBase.USE_SHA512_INTRINSICS_OPTION)).test(); } } diff --git a/hotspot/test/compiler/intrinsics/sha/cli/TestUseSHAOptionOnSupportedCPU.java b/hotspot/test/compiler/intrinsics/sha/cli/TestUseSHAOptionOnSupportedCPU.java index 5c8b28409..96c1f1379 100644 --- a/hotspot/test/compiler/intrinsics/sha/cli/TestUseSHAOptionOnSupportedCPU.java +++ b/hotspot/test/compiler/intrinsics/sha/cli/TestUseSHAOptionOnSupportedCPU.java @@ -34,12 +34,12 @@ */ public class TestUseSHAOptionOnSupportedCPU { public static void main(String args[]) throws Throwable { - new SHAOptionsBase( + new DigestOptionsBase( new GenericTestCaseForSupportedSparcCPU( - SHAOptionsBase.USE_SHA_OPTION), + DigestOptionsBase.USE_SHA_OPTION), new UseSHASpecificTestCaseForSupportedSparcCPU( - SHAOptionsBase.USE_SHA_OPTION), + DigestOptionsBase.USE_SHA_OPTION), new GenericTestCaseForSupportedAArch64CPU( - SHAOptionsBase.USE_SHA_OPTION)).test(); + DigestOptionsBase.USE_SHA_OPTION)).test(); } } diff --git a/hotspot/test/compiler/intrinsics/sha/cli/TestUseSHAOptionOnUnsupportedCPU.java b/hotspot/test/compiler/intrinsics/sha/cli/TestUseSHAOptionOnUnsupportedCPU.java index f5dfc4897..e1ddb54a3 100644 --- a/hotspot/test/compiler/intrinsics/sha/cli/TestUseSHAOptionOnUnsupportedCPU.java +++ b/hotspot/test/compiler/intrinsics/sha/cli/TestUseSHAOptionOnUnsupportedCPU.java @@ -34,16 +34,16 @@ */ public class TestUseSHAOptionOnUnsupportedCPU { public static void main(String args[]) throws Throwable { - new SHAOptionsBase( + new DigestOptionsBase( new GenericTestCaseForUnsupportedSparcCPU( - SHAOptionsBase.USE_SHA_OPTION), + DigestOptionsBase.USE_SHA_OPTION), new UseSHASpecificTestCaseForUnsupportedSparcCPU( - SHAOptionsBase.USE_SHA_OPTION), + DigestOptionsBase.USE_SHA_OPTION), new GenericTestCaseForUnsupportedAArch64CPU( - SHAOptionsBase.USE_SHA_OPTION), + DigestOptionsBase.USE_SHA_OPTION), new GenericTestCaseForUnsupportedX86CPU( - SHAOptionsBase.USE_SHA_OPTION), + DigestOptionsBase.USE_SHA_OPTION), new GenericTestCaseForOtherCPU( - SHAOptionsBase.USE_SHA_OPTION)).test(); + DigestOptionsBase.USE_SHA_OPTION)).test(); } } diff --git a/hotspot/test/compiler/intrinsics/sha/cli/testcases/GenericTestCaseForOtherCPU.java b/hotspot/test/compiler/intrinsics/sha/cli/testcases/GenericTestCaseForOtherCPU.java index fa9a6f208..72d067f2c 100644 --- a/hotspot/test/compiler/intrinsics/sha/cli/testcases/GenericTestCaseForOtherCPU.java +++ b/hotspot/test/compiler/intrinsics/sha/cli/testcases/GenericTestCaseForOtherCPU.java @@ -32,7 +32,7 @@ import com.oracle.java.testlibrary.cli.predicate.OrPredicate; * non-SPARC CPUs. */ public class GenericTestCaseForOtherCPU extends - SHAOptionsBase.TestCase { + DigestOptionsBase.TestCase { public GenericTestCaseForOtherCPU(String optionName) { // Execute the test case on any CPU except SPARC and X86 super(optionName, new NotPredicate(new OrPredicate(Platform::isSparc, @@ -47,26 +47,31 @@ public class GenericTestCaseForOtherCPU extends // options will not cause any warnings. CommandLineOptionTest.verifySameJVMStartup(null, new String[] { ".*" + optionName + ".*" }, ExitCode.OK, + DigestOptionsBase.UNLOCK_DIAGNOSTIC_VM_OPTIONS, CommandLineOptionTest.prepareBooleanFlag(optionName, true)); CommandLineOptionTest.verifySameJVMStartup(null, new String[] { ".*" + optionName + ".*" }, ExitCode.OK, + DigestOptionsBase.UNLOCK_DIAGNOSTIC_VM_OPTIONS, CommandLineOptionTest.prepareBooleanFlag(optionName, false)); } @Override protected void verifyOptionValues() throws Throwable { // Verify that option is disabled by default. - CommandLineOptionTest.verifyOptionValueForSameVM(optionName, "false"); + CommandLineOptionTest.verifyOptionValueForSameVM(optionName, "false", + DigestOptionsBase.UNLOCK_DIAGNOSTIC_VM_OPTIONS); // Verify that option is disabled even if it was explicitly enabled // using CLI options. CommandLineOptionTest.verifyOptionValueForSameVM(optionName, "false", + DigestOptionsBase.UNLOCK_DIAGNOSTIC_VM_OPTIONS, CommandLineOptionTest.prepareBooleanFlag(optionName, true)); // Verify that option is disabled when it explicitly disabled // using CLI options. CommandLineOptionTest.verifyOptionValueForSameVM(optionName, "false", + DigestOptionsBase.UNLOCK_DIAGNOSTIC_VM_OPTIONS, CommandLineOptionTest.prepareBooleanFlag(optionName, false)); } } diff --git a/hotspot/test/compiler/intrinsics/sha/cli/testcases/GenericTestCaseForSupportedAArch64CPU.java b/hotspot/test/compiler/intrinsics/sha/cli/testcases/GenericTestCaseForSupportedAArch64CPU.java index 1c77ff055..a7bd40f9e 100644 --- a/hotspot/test/compiler/intrinsics/sha/cli/testcases/GenericTestCaseForSupportedAArch64CPU.java +++ b/hotspot/test/compiler/intrinsics/sha/cli/testcases/GenericTestCaseForSupportedAArch64CPU.java @@ -31,63 +31,71 @@ import com.oracle.java.testlibrary.cli.predicate.AndPredicate; * support instructions required by the tested option. */ public class GenericTestCaseForSupportedAArch64CPU extends - SHAOptionsBase.TestCase { + DigestOptionsBase.TestCase { public GenericTestCaseForSupportedAArch64CPU(String optionName) { super(optionName, new AndPredicate(Platform::isAArch64, - SHAOptionsBase.getPredicateForOption(optionName))); + DigestOptionsBase.getPredicateForOption(optionName))); } @Override protected void verifyWarnings() throws Throwable { // Verify that there are no warning when option is explicitly enabled. CommandLineOptionTest.verifySameJVMStartup(null, new String[] { - SHAOptionsBase.getWarningForUnsupportedCPU(optionName) + DigestOptionsBase.getWarningForUnsupportedCPU(optionName) }, ExitCode.OK, + DigestOptionsBase.UNLOCK_DIAGNOSTIC_VM_OPTIONS, CommandLineOptionTest.prepareBooleanFlag(optionName, true)); // Verify that option could be disabled even if +UseSHA was passed to // JVM. CommandLineOptionTest.verifySameJVMStartup(null, new String[] { - SHAOptionsBase.getWarningForUnsupportedCPU(optionName) + DigestOptionsBase.getWarningForUnsupportedCPU(optionName) }, ExitCode.OK, + DigestOptionsBase.UNLOCK_DIAGNOSTIC_VM_OPTIONS, CommandLineOptionTest.prepareBooleanFlag( - SHAOptionsBase.USE_SHA_OPTION, true), + DigestOptionsBase.USE_SHA_OPTION, true), CommandLineOptionTest.prepareBooleanFlag(optionName, false)); // Verify that it is possible to enable the tested option and disable // all SHA intrinsics via -UseSHA without any warnings. CommandLineOptionTest.verifySameJVMStartup(null, new String[] { - SHAOptionsBase.getWarningForUnsupportedCPU(optionName) + DigestOptionsBase.getWarningForUnsupportedCPU(optionName) }, ExitCode.OK, + DigestOptionsBase.UNLOCK_DIAGNOSTIC_VM_OPTIONS, CommandLineOptionTest.prepareBooleanFlag( - SHAOptionsBase.USE_SHA_OPTION, false), + DigestOptionsBase.USE_SHA_OPTION, false), CommandLineOptionTest.prepareBooleanFlag(optionName, true)); } @Override protected void verifyOptionValues() throws Throwable { // Verify that on supported CPU option is enabled by default. - CommandLineOptionTest.verifyOptionValueForSameVM(optionName, "true"); + CommandLineOptionTest.verifyOptionValueForSameVM(optionName, "true", + DigestOptionsBase.UNLOCK_DIAGNOSTIC_VM_OPTIONS); // Verify that it is possible to explicitly enable the option. CommandLineOptionTest.verifyOptionValueForSameVM(optionName, "true", + DigestOptionsBase.UNLOCK_DIAGNOSTIC_VM_OPTIONS, CommandLineOptionTest.prepareBooleanFlag(optionName, true)); // Verify that it is possible to explicitly disable the option. CommandLineOptionTest.verifyOptionValueForSameVM(optionName, "false", + DigestOptionsBase.UNLOCK_DIAGNOSTIC_VM_OPTIONS, CommandLineOptionTest.prepareBooleanFlag(optionName, false)); // verify that option is disabled when -UseSHA was passed to JVM. CommandLineOptionTest.verifyOptionValueForSameVM(optionName, "false", + DigestOptionsBase.UNLOCK_DIAGNOSTIC_VM_OPTIONS, CommandLineOptionTest.prepareBooleanFlag(optionName, true), CommandLineOptionTest.prepareBooleanFlag( - SHAOptionsBase.USE_SHA_OPTION, false)); + DigestOptionsBase.USE_SHA_OPTION, false)); // Verify that it is possible to explicitly disable the tested option // even if +UseSHA was passed to JVM. CommandLineOptionTest.verifyOptionValueForSameVM(optionName, "false", + DigestOptionsBase.UNLOCK_DIAGNOSTIC_VM_OPTIONS, CommandLineOptionTest.prepareBooleanFlag( - SHAOptionsBase.USE_SHA_OPTION, true), + DigestOptionsBase.USE_SHA_OPTION, true), CommandLineOptionTest.prepareBooleanFlag(optionName, false)); } } diff --git a/hotspot/test/compiler/intrinsics/sha/cli/testcases/GenericTestCaseForSupportedSparcCPU.java b/hotspot/test/compiler/intrinsics/sha/cli/testcases/GenericTestCaseForSupportedSparcCPU.java index c8ce2d52c..d443609de 100644 --- a/hotspot/test/compiler/intrinsics/sha/cli/testcases/GenericTestCaseForSupportedSparcCPU.java +++ b/hotspot/test/compiler/intrinsics/sha/cli/testcases/GenericTestCaseForSupportedSparcCPU.java @@ -31,63 +31,71 @@ import com.oracle.java.testlibrary.cli.predicate.AndPredicate; * support instructions required by the tested option. */ public class GenericTestCaseForSupportedSparcCPU extends - SHAOptionsBase.TestCase { + DigestOptionsBase.TestCase { public GenericTestCaseForSupportedSparcCPU(String optionName) { super(optionName, new AndPredicate(Platform::isSparc, - SHAOptionsBase.getPredicateForOption(optionName))); + DigestOptionsBase.getPredicateForOption(optionName))); } @Override protected void verifyWarnings() throws Throwable { // Verify that there are no warning when option is explicitly enabled. CommandLineOptionTest.verifySameJVMStartup(null, new String[] { - SHAOptionsBase.getWarningForUnsupportedCPU(optionName) + DigestOptionsBase.getWarningForUnsupportedCPU(optionName) }, ExitCode.OK, + DigestOptionsBase.UNLOCK_DIAGNOSTIC_VM_OPTIONS, CommandLineOptionTest.prepareBooleanFlag(optionName, true)); // Verify that option could be disabled even if +UseSHA was passed to // JVM. CommandLineOptionTest.verifySameJVMStartup(null, new String[] { - SHAOptionsBase.getWarningForUnsupportedCPU(optionName) + DigestOptionsBase.getWarningForUnsupportedCPU(optionName) }, ExitCode.OK, + DigestOptionsBase.UNLOCK_DIAGNOSTIC_VM_OPTIONS, CommandLineOptionTest.prepareBooleanFlag( - SHAOptionsBase.USE_SHA_OPTION, true), + DigestOptionsBase.USE_SHA_OPTION, true), CommandLineOptionTest.prepareBooleanFlag(optionName, false)); // Verify that it is possible to enable the tested option and disable // all SHA intrinsics via -UseSHA without any warnings. CommandLineOptionTest.verifySameJVMStartup(null, new String[] { - SHAOptionsBase.getWarningForUnsupportedCPU(optionName) + DigestOptionsBase.getWarningForUnsupportedCPU(optionName) }, ExitCode.OK, + DigestOptionsBase.UNLOCK_DIAGNOSTIC_VM_OPTIONS, CommandLineOptionTest.prepareBooleanFlag( - SHAOptionsBase.USE_SHA_OPTION, false), + DigestOptionsBase.USE_SHA_OPTION, false), CommandLineOptionTest.prepareBooleanFlag(optionName, true)); } @Override protected void verifyOptionValues() throws Throwable { // Verify that on supported CPU option is enabled by default. - CommandLineOptionTest.verifyOptionValueForSameVM(optionName, "true"); + CommandLineOptionTest.verifyOptionValueForSameVM(optionName, "true", + DigestOptionsBase.UNLOCK_DIAGNOSTIC_VM_OPTIONS); // Verify that it is possible to explicitly enable the option. CommandLineOptionTest.verifyOptionValueForSameVM(optionName, "true", + DigestOptionsBase.UNLOCK_DIAGNOSTIC_VM_OPTIONS, CommandLineOptionTest.prepareBooleanFlag(optionName, true)); // Verify that it is possible to explicitly disable the option. CommandLineOptionTest.verifyOptionValueForSameVM(optionName, "false", + DigestOptionsBase.UNLOCK_DIAGNOSTIC_VM_OPTIONS, CommandLineOptionTest.prepareBooleanFlag(optionName, false)); // verify that option is disabled when -UseSHA was passed to JVM. CommandLineOptionTest.verifyOptionValueForSameVM(optionName, "false", + DigestOptionsBase.UNLOCK_DIAGNOSTIC_VM_OPTIONS, CommandLineOptionTest.prepareBooleanFlag(optionName, true), CommandLineOptionTest.prepareBooleanFlag( - SHAOptionsBase.USE_SHA_OPTION, false)); + DigestOptionsBase.USE_SHA_OPTION, false)); // Verify that it is possible to explicitly disable the tested option // even if +UseSHA was passed to JVM. CommandLineOptionTest.verifyOptionValueForSameVM(optionName, "false", + DigestOptionsBase.UNLOCK_DIAGNOSTIC_VM_OPTIONS, CommandLineOptionTest.prepareBooleanFlag( - SHAOptionsBase.USE_SHA_OPTION, true), + DigestOptionsBase.USE_SHA_OPTION, true), CommandLineOptionTest.prepareBooleanFlag(optionName, false)); } } diff --git a/hotspot/test/compiler/intrinsics/sha/cli/testcases/GenericTestCaseForUnsupportedAArch64CPU.java b/hotspot/test/compiler/intrinsics/sha/cli/testcases/GenericTestCaseForUnsupportedAArch64CPU.java index 204979918..c3d5a6aff 100644 --- a/hotspot/test/compiler/intrinsics/sha/cli/testcases/GenericTestCaseForUnsupportedAArch64CPU.java +++ b/hotspot/test/compiler/intrinsics/sha/cli/testcases/GenericTestCaseForUnsupportedAArch64CPU.java @@ -32,10 +32,10 @@ import com.oracle.java.testlibrary.cli.predicate.NotPredicate; * support instruction required by the tested option. */ public class GenericTestCaseForUnsupportedAArch64CPU extends - SHAOptionsBase.TestCase { + DigestOptionsBase.TestCase { public GenericTestCaseForUnsupportedAArch64CPU(String optionName) { super(optionName, new AndPredicate(Platform::isAArch64, - new NotPredicate(SHAOptionsBase.getPredicateForOption( + new NotPredicate(DigestOptionsBase.getPredicateForOption( optionName)))); } @@ -43,24 +43,28 @@ public class GenericTestCaseForUnsupportedAArch64CPU extends protected void verifyWarnings() throws Throwable { //Verify that option could be disabled without any warnings. CommandLineOptionTest.verifySameJVMStartup(null, new String[] { - SHAOptionsBase.getWarningForUnsupportedCPU(optionName) + DigestOptionsBase.getWarningForUnsupportedCPU(optionName) }, ExitCode.OK, + DigestOptionsBase.UNLOCK_DIAGNOSTIC_VM_OPTIONS, CommandLineOptionTest.prepareBooleanFlag(optionName, false)); } @Override protected void verifyOptionValues() throws Throwable { // Verify that option is disabled by default. - CommandLineOptionTest.verifyOptionValueForSameVM(optionName, "false"); + CommandLineOptionTest.verifyOptionValueForSameVM(optionName, "false", + DigestOptionsBase.UNLOCK_DIAGNOSTIC_VM_OPTIONS); // Verify that option is disabled even if it was explicitly enabled // using CLI options. CommandLineOptionTest.verifyOptionValueForSameVM(optionName, "false", + DigestOptionsBase.UNLOCK_DIAGNOSTIC_VM_OPTIONS, CommandLineOptionTest.prepareBooleanFlag(optionName, true)); // Verify that option is disabled when +UseSHA was passed to JVM. CommandLineOptionTest.verifyOptionValueForSameVM(optionName, "false", + DigestOptionsBase.UNLOCK_DIAGNOSTIC_VM_OPTIONS, CommandLineOptionTest.prepareBooleanFlag( - SHAOptionsBase.USE_SHA_OPTION, true)); + DigestOptionsBase.USE_SHA_OPTION, true)); } } diff --git a/hotspot/test/compiler/intrinsics/sha/cli/testcases/GenericTestCaseForUnsupportedSparcCPU.java b/hotspot/test/compiler/intrinsics/sha/cli/testcases/GenericTestCaseForUnsupportedSparcCPU.java index 43bda2fb0..42c4ece60 100644 --- a/hotspot/test/compiler/intrinsics/sha/cli/testcases/GenericTestCaseForUnsupportedSparcCPU.java +++ b/hotspot/test/compiler/intrinsics/sha/cli/testcases/GenericTestCaseForUnsupportedSparcCPU.java @@ -32,10 +32,10 @@ import com.oracle.java.testlibrary.cli.predicate.NotPredicate; * support instruction required by the tested option. */ public class GenericTestCaseForUnsupportedSparcCPU extends - SHAOptionsBase.TestCase { + DigestOptionsBase.TestCase { public GenericTestCaseForUnsupportedSparcCPU(String optionName) { super(optionName, new AndPredicate(Platform::isSparc, - new NotPredicate(SHAOptionsBase.getPredicateForOption( + new NotPredicate(DigestOptionsBase.getPredicateForOption( optionName)))); } @@ -43,24 +43,28 @@ public class GenericTestCaseForUnsupportedSparcCPU extends protected void verifyWarnings() throws Throwable { //Verify that option could be disabled without any warnings. CommandLineOptionTest.verifySameJVMStartup(null, new String[] { - SHAOptionsBase.getWarningForUnsupportedCPU(optionName) + DigestOptionsBase.getWarningForUnsupportedCPU(optionName) }, ExitCode.OK, + DigestOptionsBase.UNLOCK_DIAGNOSTIC_VM_OPTIONS, CommandLineOptionTest.prepareBooleanFlag(optionName, false)); } @Override protected void verifyOptionValues() throws Throwable { // Verify that option is disabled by default. - CommandLineOptionTest.verifyOptionValueForSameVM(optionName, "false"); + CommandLineOptionTest.verifyOptionValueForSameVM(optionName, "false", + DigestOptionsBase.UNLOCK_DIAGNOSTIC_VM_OPTIONS); // Verify that option is disabled even if it was explicitly enabled // using CLI options. CommandLineOptionTest.verifyOptionValueForSameVM(optionName, "false", + DigestOptionsBase.UNLOCK_DIAGNOSTIC_VM_OPTIONS, CommandLineOptionTest.prepareBooleanFlag(optionName, true)); // Verify that option is disabled when +UseSHA was passed to JVM. CommandLineOptionTest.verifyOptionValueForSameVM(optionName, "false", + DigestOptionsBase.UNLOCK_DIAGNOSTIC_VM_OPTIONS, CommandLineOptionTest.prepareBooleanFlag( - SHAOptionsBase.USE_SHA_OPTION, true)); + DigestOptionsBase.USE_SHA_OPTION, true)); } } diff --git a/hotspot/test/compiler/intrinsics/sha/cli/testcases/GenericTestCaseForUnsupportedX86CPU.java b/hotspot/test/compiler/intrinsics/sha/cli/testcases/GenericTestCaseForUnsupportedX86CPU.java index d7033e524..8a8dde4ad 100644 --- a/hotspot/test/compiler/intrinsics/sha/cli/testcases/GenericTestCaseForUnsupportedX86CPU.java +++ b/hotspot/test/compiler/intrinsics/sha/cli/testcases/GenericTestCaseForUnsupportedX86CPU.java @@ -31,7 +31,7 @@ import com.oracle.java.testlibrary.cli.predicate.OrPredicate; * support SHA-related instructions. */ public class GenericTestCaseForUnsupportedX86CPU - extends SHAOptionsBase.TestCase { + extends DigestOptionsBase.TestCase { public GenericTestCaseForUnsupportedX86CPU(String optionName) { super(optionName, new OrPredicate(Platform::isX64, Platform::isX86)); } @@ -41,31 +41,36 @@ public class GenericTestCaseForUnsupportedX86CPU // Verify that when the tested option is explicitly enabled, then // a warning will occur in VM output. CommandLineOptionTest.verifySameJVMStartup(new String[] { - SHAOptionsBase.getWarningForUnsupportedCPU(optionName) + DigestOptionsBase.getWarningForUnsupportedCPU(optionName) }, null, ExitCode.OK, + DigestOptionsBase.UNLOCK_DIAGNOSTIC_VM_OPTIONS, CommandLineOptionTest.prepareBooleanFlag(optionName, true)); // Verify that the tested option could be explicitly disabled without // a warning. CommandLineOptionTest.verifySameJVMStartup(null, new String[] { - SHAOptionsBase.getWarningForUnsupportedCPU(optionName) + DigestOptionsBase.getWarningForUnsupportedCPU(optionName) }, ExitCode.OK, + DigestOptionsBase.UNLOCK_DIAGNOSTIC_VM_OPTIONS, CommandLineOptionTest.prepareBooleanFlag(optionName, false)); } @Override protected void verifyOptionValues() throws Throwable { // Verify that the tested option is disabled by default. - CommandLineOptionTest.verifyOptionValueForSameVM(optionName, "false"); + CommandLineOptionTest.verifyOptionValueForSameVM(optionName, "false", + DigestOptionsBase.UNLOCK_DIAGNOSTIC_VM_OPTIONS); // Verify that it is not possible to explicitly enable the option. CommandLineOptionTest.verifyOptionValueForSameVM(optionName, "false", + DigestOptionsBase.UNLOCK_DIAGNOSTIC_VM_OPTIONS, CommandLineOptionTest.prepareBooleanFlag(optionName, true)); // Verify that the tested option is disabled even if +UseSHA was passed // to JVM. CommandLineOptionTest.verifyOptionValueForSameVM(optionName, "false", + DigestOptionsBase.UNLOCK_DIAGNOSTIC_VM_OPTIONS, CommandLineOptionTest.prepareBooleanFlag( - SHAOptionsBase.USE_SHA_OPTION, true)); + DigestOptionsBase.USE_SHA_OPTION, true)); } } diff --git a/hotspot/test/compiler/intrinsics/sha/cli/testcases/UseSHAIntrinsicsSpecificTestCaseForUnsupportedSparcCPU.java b/hotspot/test/compiler/intrinsics/sha/cli/testcases/UseSHAIntrinsicsSpecificTestCaseForUnsupportedSparcCPU.java index 4e208eec9..cdb7d458f 100644 --- a/hotspot/test/compiler/intrinsics/sha/cli/testcases/UseSHAIntrinsicsSpecificTestCaseForUnsupportedSparcCPU.java +++ b/hotspot/test/compiler/intrinsics/sha/cli/testcases/UseSHAIntrinsicsSpecificTestCaseForUnsupportedSparcCPU.java @@ -37,7 +37,7 @@ import sha.predicate.IntrinsicPredicates; * sha512. */ public class UseSHAIntrinsicsSpecificTestCaseForUnsupportedSparcCPU - extends SHAOptionsBase.TestCase { + extends DigestOptionsBase.TestCase { public UseSHAIntrinsicsSpecificTestCaseForUnsupportedSparcCPU( String optionName) { // execute test case on SPARC CPU that support any sha* instructions, @@ -45,15 +45,16 @@ public class UseSHAIntrinsicsSpecificTestCaseForUnsupportedSparcCPU super(optionName, new AndPredicate(Platform::isSparc, new AndPredicate( IntrinsicPredicates.ANY_SHA_INSTRUCTION_AVAILABLE, - new NotPredicate(SHAOptionsBase.getPredicateForOption( + new NotPredicate(DigestOptionsBase.getPredicateForOption( optionName))))); } @Override protected void verifyWarnings() throws Throwable { // Verify that attempt to enable the tested option will cause a warning. CommandLineOptionTest.verifySameJVMStartup(new String[] { - SHAOptionsBase.getWarningForUnsupportedCPU(optionName) + DigestOptionsBase.getWarningForUnsupportedCPU(optionName) }, null, ExitCode.OK, + DigestOptionsBase.UNLOCK_DIAGNOSTIC_VM_OPTIONS, CommandLineOptionTest.prepareBooleanFlag(optionName, true)); } } diff --git a/hotspot/test/compiler/intrinsics/sha/cli/testcases/UseSHASpecificTestCaseForSupportedSparcCPU.java b/hotspot/test/compiler/intrinsics/sha/cli/testcases/UseSHASpecificTestCaseForSupportedSparcCPU.java index f54756839..7ad103c0a 100644 --- a/hotspot/test/compiler/intrinsics/sha/cli/testcases/UseSHASpecificTestCaseForSupportedSparcCPU.java +++ b/hotspot/test/compiler/intrinsics/sha/cli/testcases/UseSHASpecificTestCaseForSupportedSparcCPU.java @@ -33,13 +33,13 @@ import sha.predicate.IntrinsicPredicates; * instruction. */ public class UseSHASpecificTestCaseForSupportedSparcCPU - extends SHAOptionsBase.TestCase { + extends DigestOptionsBase.TestCase { public UseSHASpecificTestCaseForSupportedSparcCPU(String optionName) { - super(SHAOptionsBase.USE_SHA_OPTION, new AndPredicate(Platform::isSparc, + super(DigestOptionsBase.USE_SHA_OPTION, new AndPredicate(Platform::isSparc, IntrinsicPredicates.ANY_SHA_INSTRUCTION_AVAILABLE)); - Asserts.assertEQ(optionName, SHAOptionsBase.USE_SHA_OPTION, - "Test case should be used for " + SHAOptionsBase.USE_SHA_OPTION + Asserts.assertEQ(optionName, DigestOptionsBase.USE_SHA_OPTION, + "Test case should be used for " + DigestOptionsBase.USE_SHA_OPTION + " option only."); } @@ -49,14 +49,15 @@ public class UseSHASpecificTestCaseForSupportedSparcCPU // all UseSHA*Intrinsics options were disabled. CommandLineOptionTest.verifySameJVMStartup( null, new String[] { ".*UseSHA.*" }, ExitCode.OK, + DigestOptionsBase.UNLOCK_DIAGNOSTIC_VM_OPTIONS, CommandLineOptionTest.prepareBooleanFlag( - SHAOptionsBase.USE_SHA_OPTION, true), + DigestOptionsBase.USE_SHA_OPTION, true), CommandLineOptionTest.prepareBooleanFlag( - SHAOptionsBase.USE_SHA1_INTRINSICS_OPTION, false), + DigestOptionsBase.USE_SHA1_INTRINSICS_OPTION, false), CommandLineOptionTest.prepareBooleanFlag( - SHAOptionsBase.USE_SHA256_INTRINSICS_OPTION, false), + DigestOptionsBase.USE_SHA256_INTRINSICS_OPTION, false), CommandLineOptionTest.prepareBooleanFlag( - SHAOptionsBase.USE_SHA512_INTRINSICS_OPTION, false)); + DigestOptionsBase.USE_SHA512_INTRINSICS_OPTION, false)); } @Override @@ -64,38 +65,41 @@ public class UseSHASpecificTestCaseForSupportedSparcCPU // Verify that UseSHA is disabled when all UseSHA*Intrinscs are // disabled. CommandLineOptionTest.verifyOptionValueForSameVM( - SHAOptionsBase.USE_SHA_OPTION, "false", + DigestOptionsBase.USE_SHA_OPTION, "false", + DigestOptionsBase.UNLOCK_DIAGNOSTIC_VM_OPTIONS, CommandLineOptionTest.prepareBooleanFlag( - SHAOptionsBase.USE_SHA1_INTRINSICS_OPTION, false), + DigestOptionsBase.USE_SHA1_INTRINSICS_OPTION, false), CommandLineOptionTest.prepareBooleanFlag( - SHAOptionsBase.USE_SHA256_INTRINSICS_OPTION, false), + DigestOptionsBase.USE_SHA256_INTRINSICS_OPTION, false), CommandLineOptionTest.prepareBooleanFlag( - SHAOptionsBase.USE_SHA512_INTRINSICS_OPTION, false)); + DigestOptionsBase.USE_SHA512_INTRINSICS_OPTION, false)); CommandLineOptionTest.verifyOptionValueForSameVM( // Verify that UseSHA is disabled when all UseSHA*Intrinscs are // disabled even if it was explicitly enabled. - SHAOptionsBase.USE_SHA_OPTION, "false", + DigestOptionsBase.USE_SHA_OPTION, "false", + DigestOptionsBase.UNLOCK_DIAGNOSTIC_VM_OPTIONS, CommandLineOptionTest.prepareBooleanFlag( - SHAOptionsBase.USE_SHA_OPTION, true), + DigestOptionsBase.USE_SHA_OPTION, true), CommandLineOptionTest.prepareBooleanFlag( - SHAOptionsBase.USE_SHA1_INTRINSICS_OPTION, false), + DigestOptionsBase.USE_SHA1_INTRINSICS_OPTION, false), CommandLineOptionTest.prepareBooleanFlag( - SHAOptionsBase.USE_SHA256_INTRINSICS_OPTION, false), + DigestOptionsBase.USE_SHA256_INTRINSICS_OPTION, false), CommandLineOptionTest.prepareBooleanFlag( - SHAOptionsBase.USE_SHA512_INTRINSICS_OPTION, false)); + DigestOptionsBase.USE_SHA512_INTRINSICS_OPTION, false)); // Verify that explicitly disabled UseSHA option remains disabled even // if all UseSHA*Intrinsics options were enabled. CommandLineOptionTest.verifyOptionValueForSameVM( - SHAOptionsBase.USE_SHA_OPTION, "false", + DigestOptionsBase.USE_SHA_OPTION, "false", + DigestOptionsBase.UNLOCK_DIAGNOSTIC_VM_OPTIONS, CommandLineOptionTest.prepareBooleanFlag( - SHAOptionsBase.USE_SHA_OPTION, false), + DigestOptionsBase.USE_SHA_OPTION, false), CommandLineOptionTest.prepareBooleanFlag( - SHAOptionsBase.USE_SHA1_INTRINSICS_OPTION, true), + DigestOptionsBase.USE_SHA1_INTRINSICS_OPTION, true), CommandLineOptionTest.prepareBooleanFlag( - SHAOptionsBase.USE_SHA256_INTRINSICS_OPTION, true), + DigestOptionsBase.USE_SHA256_INTRINSICS_OPTION, true), CommandLineOptionTest.prepareBooleanFlag( - SHAOptionsBase.USE_SHA512_INTRINSICS_OPTION, true)); + DigestOptionsBase.USE_SHA512_INTRINSICS_OPTION, true)); } } diff --git a/hotspot/test/compiler/intrinsics/sha/cli/testcases/UseSHASpecificTestCaseForUnsupportedSparcCPU.java b/hotspot/test/compiler/intrinsics/sha/cli/testcases/UseSHASpecificTestCaseForUnsupportedSparcCPU.java index 5aceed607..899ece621 100644 --- a/hotspot/test/compiler/intrinsics/sha/cli/testcases/UseSHASpecificTestCaseForUnsupportedSparcCPU.java +++ b/hotspot/test/compiler/intrinsics/sha/cli/testcases/UseSHASpecificTestCaseForUnsupportedSparcCPU.java @@ -34,14 +34,14 @@ import sha.predicate.IntrinsicPredicates; * instructions. */ public class UseSHASpecificTestCaseForUnsupportedSparcCPU - extends SHAOptionsBase.TestCase { + extends DigestOptionsBase.TestCase { public UseSHASpecificTestCaseForUnsupportedSparcCPU(String optionName) { - super(SHAOptionsBase.USE_SHA_OPTION, new AndPredicate(Platform::isSparc, + super(DigestOptionsBase.USE_SHA_OPTION, new AndPredicate(Platform::isSparc, new NotPredicate( IntrinsicPredicates.ANY_SHA_INSTRUCTION_AVAILABLE))); - Asserts.assertEQ(optionName, SHAOptionsBase.USE_SHA_OPTION, - "Test case should be used for " + SHAOptionsBase.USE_SHA_OPTION + Asserts.assertEQ(optionName, DigestOptionsBase.USE_SHA_OPTION, + "Test case should be used for " + DigestOptionsBase.USE_SHA_OPTION + " option only."); } @@ -49,8 +49,9 @@ public class UseSHASpecificTestCaseForUnsupportedSparcCPU protected void verifyWarnings() throws Throwable { // Verify that attempt to use UseSHA option will cause a warning. CommandLineOptionTest.verifySameJVMStartup(new String[] { - SHAOptionsBase.getWarningForUnsupportedCPU(optionName) + DigestOptionsBase.getWarningForUnsupportedCPU(optionName) }, null, ExitCode.OK, + DigestOptionsBase.UNLOCK_DIAGNOSTIC_VM_OPTIONS, CommandLineOptionTest.prepareBooleanFlag(optionName, true)); } @@ -59,25 +60,27 @@ public class UseSHASpecificTestCaseForUnsupportedSparcCPU // Verify that UseSHA option remains disabled even if all // UseSHA*Intrincs options were enabled. CommandLineOptionTest.verifyOptionValueForSameVM( - SHAOptionsBase.USE_SHA_OPTION, "false", + DigestOptionsBase.USE_SHA_OPTION, "false", + DigestOptionsBase.UNLOCK_DIAGNOSTIC_VM_OPTIONS, CommandLineOptionTest.prepareBooleanFlag( - SHAOptionsBase.USE_SHA1_INTRINSICS_OPTION, true), + DigestOptionsBase.USE_SHA1_INTRINSICS_OPTION, true), CommandLineOptionTest.prepareBooleanFlag( - SHAOptionsBase.USE_SHA256_INTRINSICS_OPTION, true), + DigestOptionsBase.USE_SHA256_INTRINSICS_OPTION, true), CommandLineOptionTest.prepareBooleanFlag( - SHAOptionsBase.USE_SHA512_INTRINSICS_OPTION, true)); + DigestOptionsBase.USE_SHA512_INTRINSICS_OPTION, true)); // Verify that UseSHA option remains disabled even if all // UseSHA*Intrincs options were enabled and UseSHA was enabled as well. CommandLineOptionTest.verifyOptionValueForSameVM( - SHAOptionsBase.USE_SHA_OPTION, "false", + DigestOptionsBase.USE_SHA_OPTION, "false", + DigestOptionsBase.UNLOCK_DIAGNOSTIC_VM_OPTIONS, CommandLineOptionTest.prepareBooleanFlag( - SHAOptionsBase.USE_SHA_OPTION, true), + DigestOptionsBase.USE_SHA_OPTION, true), CommandLineOptionTest.prepareBooleanFlag( - SHAOptionsBase.USE_SHA1_INTRINSICS_OPTION, true), + DigestOptionsBase.USE_SHA1_INTRINSICS_OPTION, true), CommandLineOptionTest.prepareBooleanFlag( - SHAOptionsBase.USE_SHA256_INTRINSICS_OPTION, true), + DigestOptionsBase.USE_SHA256_INTRINSICS_OPTION, true), CommandLineOptionTest.prepareBooleanFlag( - SHAOptionsBase.USE_SHA512_INTRINSICS_OPTION, true)); + DigestOptionsBase.USE_SHA512_INTRINSICS_OPTION, true)); } } diff --git a/hotspot/test/compiler/intrinsics/sha/sanity/SHASanityTestBase.java b/hotspot/test/compiler/intrinsics/sha/sanity/DigestSanityTestBase.java similarity index 83% rename from hotspot/test/compiler/intrinsics/sha/sanity/SHASanityTestBase.java rename to hotspot/test/compiler/intrinsics/sha/sanity/DigestSanityTestBase.java index 13b10a512..d9c363f20 100644 --- a/hotspot/test/compiler/intrinsics/sha/sanity/SHASanityTestBase.java +++ b/hotspot/test/compiler/intrinsics/sha/sanity/DigestSanityTestBase.java @@ -1,5 +1,6 @@ /* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, Huawei Technologies Co., Ltd. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -21,6 +22,7 @@ * questions. */ +import compiler.intrinsics.sha.TestDigest; import intrinsics.Verifier; import sun.hotspot.WhiteBox; @@ -33,7 +35,9 @@ import java.util.function.BooleanSupplier; /** * Base class for sanity tests on SHA intrinsics support. */ -public class SHASanityTestBase { +public class DigestSanityTestBase { + protected static final String MD5_INTRINSIC_ID + = "_md5_implCompress"; protected static final String SHA1_INTRINSIC_ID = "_sha_implCompress"; protected static final String SHA256_INTRINSIC_ID @@ -62,7 +66,7 @@ public class SHASanityTestBase { * be used. * @param intrinsicID The ID of the intrinsic to be tested. */ - protected SHASanityTestBase(BooleanSupplier predicate, String intrinsicID) { + protected DigestSanityTestBase(BooleanSupplier predicate, String intrinsicID) { this.predicate = predicate; this.intrinsicID = intrinsicID; } @@ -79,10 +83,10 @@ public class SHASanityTestBase { dumpProperties(); - TestSHA.testSHA(SHASanityTestBase.PROVIDER, algorithm, - SHASanityTestBase.MSG_SIZE, SHASanityTestBase.OFFSET, - SHASanityTestBase.ITERATIONS, - SHASanityTestBase.WARMUP_ITERATIONS); + TestDigest.testDigest(DigestSanityTestBase.PROVIDER, algorithm, + DigestSanityTestBase.MSG_SIZE, DigestSanityTestBase.OFFSET, + DigestSanityTestBase.ITERATIONS, + DigestSanityTestBase.WARMUP_ITERATIONS); } /** @@ -99,7 +103,7 @@ public class SHASanityTestBase { String.valueOf(predicate.getAsBoolean())); String logFileName - = SHASanityTestBase.WHITE_BOX.getStringVMFlag("LogFile"); + = DigestSanityTestBase.WHITE_BOX.getStringVMFlag("LogFile"); FileOutputStream fileOutputStream = new FileOutputStream(logFileName + Verifier.PROPERTY_FILE_SUFFIX); diff --git a/hotspot/test/compiler/intrinsics/sha/sanity/TestMD5Intrinsics.java b/hotspot/test/compiler/intrinsics/sha/sanity/TestMD5Intrinsics.java new file mode 100644 index 000000000..b29a54f1a --- /dev/null +++ b/hotspot/test/compiler/intrinsics/sha/sanity/TestMD5Intrinsics.java @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, Huawei Technologies Co., Ltd. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/** + * @test + * @bug 8035968 + * @summary Verify that MD5 intrinsic is actually used. + * @library /testlibrary /testlibrary/whitebox /compiler/testlibrary ../ + * @modules java.base/jdk.internal.misc + * java.management + * + * @build TestDigest TestMD5Intrinsics intrinsics.Verifier + * @run main ClassFileInstaller sun.hotspot.WhiteBox + * sun.hotspot.WhiteBox$WhiteBoxPermission + * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions + * -XX:+WhiteBoxAPI -Xbatch -XX:CompileThreshold=500 + * -XX:Tier4InvocationThreshold=500 + * -XX:+LogCompilation -XX:LogFile=positive.log + * -XX:CompileOnly=sun/security/provider/DigestBase + * -XX:CompileOnly=sun/security/provider/MD5 + * -XX:+UseMD5Intrinsics + * -Dalgorithm=MD5 + * TestMD5Intrinsics + * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions + * -XX:+WhiteBoxAPI -Xbatch -XX:CompileThreshold=500 + * -XX:Tier4InvocationThreshold=500 + * -XX:+LogCompilation -XX:LogFile=negative.log + * -XX:CompileOnly=sun/security/provider/DigestBase + * -XX:CompileOnly=sun/security/provider/MD5 + * -XX:-UseMD5Intrinsics + * -Dalgorithm=MD5 + * TestMD5Intrinsics + * @run main/othervm -DverificationStrategy=VERIFY_INTRINSIC_USAGE + * intrinsics.Verifier positive.log negative.log + */ + + +import sha.predicate.IntrinsicPredicates; + +public class TestMD5Intrinsics { + public static void main(String args[]) throws Exception { + new DigestSanityTestBase(IntrinsicPredicates.isMD5IntrinsicAvailable(), + DigestSanityTestBase.MD5_INTRINSIC_ID).test(); + } +} diff --git a/hotspot/test/compiler/intrinsics/sha/sanity/TestMD5MultiBlockIntrinsics.java b/hotspot/test/compiler/intrinsics/sha/sanity/TestMD5MultiBlockIntrinsics.java new file mode 100644 index 000000000..7807cfcfd --- /dev/null +++ b/hotspot/test/compiler/intrinsics/sha/sanity/TestMD5MultiBlockIntrinsics.java @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, Huawei Technologies Co., Ltd. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/** + * @test + * @bug 8035968 + * @summary Verify that MD5 multi block intrinsic is actually used. + * @library /testlibrary /testlibrary/whitebox /compiler/testlibrary ../ + * @modules java.base/jdk.internal.misc + * java.management + * + * @build TestDigest intrinsics.Verifier TestMD5MultiBlockIntrinsics + * @run main ClassFileInstaller sun.hotspot.WhiteBox + * sun.hotspot.WhiteBox$WhiteBoxPermission + * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions + * -XX:+WhiteBoxAPI -Xbatch -XX:CompileThreshold=500 + * -XX:Tier4InvocationThreshold=500 + * -XX:+LogCompilation -XX:LogFile=positive.log + * -XX:CompileOnly=sun/security/provider/DigestBase + * -XX:CompileOnly=sun/security/provider/MD5 + * -XX:+UseMD5Intrinsics -XX:-UseSHA1Intrinsics + * -XX:-UseSHA256Intrinsics -XX:-UseSHA512Intrinsics + * -Dalgorithm=MD5 + * TestMD5MultiBlockIntrinsics + * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions + * -XX:+WhiteBoxAPI -Xbatch -XX:CompileThreshold=500 + * -XX:Tier4InvocationThreshold=500 + * -XX:+LogCompilation -XX:LogFile=positive_def.log + * -XX:CompileOnly=sun/security/provider/DigestBase + * -XX:CompileOnly=sun/security/provider/MD5 + * -XX:+UseMD5Intrinsics -Dalgorithm=MD5 + * TestMD5MultiBlockIntrinsics + * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions + * -XX:+WhiteBoxAPI -Xbatch -XX:CompileThreshold=500 + * -XX:Tier4InvocationThreshold=500 + * -XX:+LogCompilation -XX:LogFile=negative.log + * -XX:CompileOnly=sun/security/provider/DigestBase + * -XX:CompileOnly=sun/security/provider/MD5 + * -Dalgorithm=MD5 + * TestMD5MultiBlockIntrinsics + * @run main/othervm -DverificationStrategy=VERIFY_INTRINSIC_USAGE + * intrinsics.Verifier positive.log positive_def.log + * negative.log + */ + +import sha.predicate.IntrinsicPredicates; + +public class TestMD5MultiBlockIntrinsics { + public static void main(String args[]) throws Exception { + new DigestSanityTestBase(IntrinsicPredicates.isMD5IntrinsicAvailable(), + DigestSanityTestBase.MB_INTRINSIC_ID).test(); + } +} diff --git a/hotspot/test/compiler/intrinsics/sha/sanity/TestSHA1Intrinsics.java b/hotspot/test/compiler/intrinsics/sha/sanity/TestSHA1Intrinsics.java index 123fed300..43e783f96 100644 --- a/hotspot/test/compiler/intrinsics/sha/sanity/TestSHA1Intrinsics.java +++ b/hotspot/test/compiler/intrinsics/sha/sanity/TestSHA1Intrinsics.java @@ -26,7 +26,7 @@ * @bug 8035968 * @summary Verify that SHA-1 intrinsic is actually used. * @library /testlibrary /testlibrary/whitebox /compiler/testlibrary ../ - * @build TestSHA intrinsics.Verifier TestSHA1Intrinsics + * @build TestDigest intrinsics.Verifier TestSHA1Intrinsics * @run main ClassFileInstaller sun.hotspot.WhiteBox * sun.hotspot.WhiteBox$WhiteBoxPermission * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions @@ -52,7 +52,7 @@ import sha.predicate.IntrinsicPredicates; public class TestSHA1Intrinsics { public static void main(String args[]) throws Exception { - new SHASanityTestBase(IntrinsicPredicates.SHA1_INTRINSICS_AVAILABLE, - SHASanityTestBase.SHA1_INTRINSIC_ID).test(); + new DigestSanityTestBase(IntrinsicPredicates.SHA1_INTRINSICS_AVAILABLE, + DigestSanityTestBase.SHA1_INTRINSIC_ID).test(); } } diff --git a/hotspot/test/compiler/intrinsics/sha/sanity/TestSHA1MultiBlockIntrinsics.java b/hotspot/test/compiler/intrinsics/sha/sanity/TestSHA1MultiBlockIntrinsics.java index 68e573335..4c74b849d 100644 --- a/hotspot/test/compiler/intrinsics/sha/sanity/TestSHA1MultiBlockIntrinsics.java +++ b/hotspot/test/compiler/intrinsics/sha/sanity/TestSHA1MultiBlockIntrinsics.java @@ -28,7 +28,7 @@ import sha.predicate.IntrinsicPredicates; * @bug 8035968 * @summary Verify that SHA-1 multi block intrinsic is actually used. * @library /testlibrary /testlibrary/whitebox /compiler/testlibrary ../ - * @build TestSHA intrinsics.Verifier TestSHA1MultiBlockIntrinsics + * @build TestDigest intrinsics.Verifier TestSHA1MultiBlockIntrinsics * @run main ClassFileInstaller sun.hotspot.WhiteBox * sun.hotspot.WhiteBox$WhiteBoxPermission * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions @@ -37,8 +37,8 @@ import sha.predicate.IntrinsicPredicates; * -XX:+LogCompilation -XX:LogFile=positive.log * -XX:CompileOnly=sun/security/provider/DigestBase * -XX:CompileOnly=sun/security/provider/SHA - * -XX:+UseSHA1Intrinsics -XX:-UseSHA256Intrinsics - * -XX:-UseSHA512Intrinsics + * -XX:+UseSHA1Intrinsics -XX:-UseMD5Intrinsics + * -XX:-UseSHA256Intrinsics -XX:-UseSHA512Intrinsics * -Dalgorithm=SHA-1 TestSHA1MultiBlockIntrinsics * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions * -XX:+WhiteBoxAPI -Xbatch -XX:CompileThreshold=500 @@ -61,7 +61,7 @@ import sha.predicate.IntrinsicPredicates; */ public class TestSHA1MultiBlockIntrinsics { public static void main(String args[]) throws Exception { - new SHASanityTestBase(IntrinsicPredicates.SHA1_INTRINSICS_AVAILABLE, - SHASanityTestBase.MB_INTRINSIC_ID).test(); + new DigestSanityTestBase(IntrinsicPredicates.SHA1_INTRINSICS_AVAILABLE, + DigestSanityTestBase.MB_INTRINSIC_ID).test(); } } diff --git a/hotspot/test/compiler/intrinsics/sha/sanity/TestSHA256Intrinsics.java b/hotspot/test/compiler/intrinsics/sha/sanity/TestSHA256Intrinsics.java index 2730ed35a..d6c3efc92 100644 --- a/hotspot/test/compiler/intrinsics/sha/sanity/TestSHA256Intrinsics.java +++ b/hotspot/test/compiler/intrinsics/sha/sanity/TestSHA256Intrinsics.java @@ -28,7 +28,7 @@ import sha.predicate.IntrinsicPredicates; * @bug 8035968 * @summary Verify that SHA-256 intrinsic is actually used. * @library /testlibrary /testlibrary/whitebox /compiler/testlibrary ../ - * @build TestSHA intrinsics.Verifier TestSHA256Intrinsics + * @build TestDigest intrinsics.Verifier TestSHA256Intrinsics * @run main ClassFileInstaller sun.hotspot.WhiteBox * sun.hotspot.WhiteBox$WhiteBoxPermission * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions @@ -69,7 +69,7 @@ import sha.predicate.IntrinsicPredicates; */ public class TestSHA256Intrinsics { public static void main(String args[]) throws Exception { - new SHASanityTestBase(IntrinsicPredicates.SHA256_INTRINSICS_AVAILABLE, - SHASanityTestBase.SHA256_INTRINSIC_ID).test(); + new DigestSanityTestBase(IntrinsicPredicates.SHA256_INTRINSICS_AVAILABLE, + DigestSanityTestBase.SHA256_INTRINSIC_ID).test(); } } diff --git a/hotspot/test/compiler/intrinsics/sha/sanity/TestSHA256MultiBlockIntrinsics.java b/hotspot/test/compiler/intrinsics/sha/sanity/TestSHA256MultiBlockIntrinsics.java index dda126dc8..8659a3cac 100644 --- a/hotspot/test/compiler/intrinsics/sha/sanity/TestSHA256MultiBlockIntrinsics.java +++ b/hotspot/test/compiler/intrinsics/sha/sanity/TestSHA256MultiBlockIntrinsics.java @@ -28,7 +28,7 @@ import sha.predicate.IntrinsicPredicates; * @bug 8035968 * @summary Verify that SHA-256 multi block intrinsic is actually used. * @library /testlibrary /testlibrary/whitebox /compiler/testlibrary ../ - * @build TestSHA intrinsics.Verifier TestSHA256MultiBlockIntrinsics + * @build TestDigest intrinsics.Verifier TestSHA256MultiBlockIntrinsics * @run main ClassFileInstaller sun.hotspot.WhiteBox * sun.hotspot.WhiteBox$WhiteBoxPermission * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions @@ -37,8 +37,8 @@ import sha.predicate.IntrinsicPredicates; * -XX:+LogCompilation -XX:LogFile=positive_224.log * -XX:CompileOnly=sun/security/provider/DigestBase * -XX:CompileOnly=sun/security/provider/SHA - * -XX:+UseSHA256Intrinsics -XX:-UseSHA1Intrinsics - * -XX:-UseSHA512Intrinsics + * -XX:+UseSHA1Intrinsics -XX:-UseMD5Intrinsics + * -XX:-UseSHA256Intrinsics -XX:-UseSHA512Intrinsics * -Dalgorithm=SHA-224 TestSHA256MultiBlockIntrinsics * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions * -XX:+WhiteBoxAPI -Xbatch -XX:CompileThreshold=500 @@ -61,8 +61,8 @@ import sha.predicate.IntrinsicPredicates; * -XX:+LogCompilation -XX:LogFile=positive_256.log * -XX:CompileOnly=sun/security/provider/DigestBase * -XX:CompileOnly=sun/security/provider/SHA - * -XX:+UseSHA256Intrinsics -XX:-UseSHA1Intrinsics - * -XX:-UseSHA512Intrinsics + * -XX:+UseSHA1Intrinsics -XX:-UseMD5Intrinsics + * -XX:-UseSHA256Intrinsics -XX:-UseSHA512Intrinsics * -Dalgorithm=SHA-256 TestSHA256MultiBlockIntrinsics * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions * -XX:+WhiteBoxAPI -Xbatch -XX:CompileThreshold=500 @@ -86,7 +86,7 @@ import sha.predicate.IntrinsicPredicates; */ public class TestSHA256MultiBlockIntrinsics { public static void main(String args[]) throws Exception { - new SHASanityTestBase(IntrinsicPredicates.SHA256_INTRINSICS_AVAILABLE, - SHASanityTestBase.MB_INTRINSIC_ID).test(); + new DigestSanityTestBase(IntrinsicPredicates.SHA256_INTRINSICS_AVAILABLE, + DigestSanityTestBase.MB_INTRINSIC_ID).test(); } } diff --git a/hotspot/test/compiler/intrinsics/sha/sanity/TestSHA512Intrinsics.java b/hotspot/test/compiler/intrinsics/sha/sanity/TestSHA512Intrinsics.java index 02c8ad698..c7a5d89ea 100644 --- a/hotspot/test/compiler/intrinsics/sha/sanity/TestSHA512Intrinsics.java +++ b/hotspot/test/compiler/intrinsics/sha/sanity/TestSHA512Intrinsics.java @@ -28,7 +28,7 @@ import sha.predicate.IntrinsicPredicates; * @bug 8035968 * @summary Verify that SHA-512 intrinsic is actually used. * @library /testlibrary /testlibrary/whitebox /compiler/testlibrary ../ - * @build TestSHA intrinsics.Verifier TestSHA512Intrinsics + * @build TestDigest intrinsics.Verifier TestSHA512Intrinsics * @run main ClassFileInstaller sun.hotspot.WhiteBox * sun.hotspot.WhiteBox$WhiteBoxPermission * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions @@ -69,7 +69,7 @@ import sha.predicate.IntrinsicPredicates; */ public class TestSHA512Intrinsics { public static void main(String args[]) throws Exception { - new SHASanityTestBase(IntrinsicPredicates.SHA512_INTRINSICS_AVAILABLE, - SHASanityTestBase.SHA512_INTRINSIC_ID).test(); + new DigestSanityTestBase(IntrinsicPredicates.SHA512_INTRINSICS_AVAILABLE, + DigestSanityTestBase.SHA512_INTRINSIC_ID).test(); } } diff --git a/hotspot/test/compiler/intrinsics/sha/sanity/TestSHA512MultiBlockIntrinsics.java b/hotspot/test/compiler/intrinsics/sha/sanity/TestSHA512MultiBlockIntrinsics.java index d958d489d..ed503b042 100644 --- a/hotspot/test/compiler/intrinsics/sha/sanity/TestSHA512MultiBlockIntrinsics.java +++ b/hotspot/test/compiler/intrinsics/sha/sanity/TestSHA512MultiBlockIntrinsics.java @@ -28,7 +28,7 @@ import sha.predicate.IntrinsicPredicates; * @bug 8035968 * @summary Verify that SHA-512 multi block intrinsic is actually used. * @library /testlibrary /testlibrary/whitebox /compiler/testlibrary ../ - * @build TestSHA intrinsics.Verifier TestSHA512MultiBlockIntrinsics + * @build TestDigest intrinsics.Verifier TestSHA512MultiBlockIntrinsics * @run main ClassFileInstaller sun.hotspot.WhiteBox * sun.hotspot.WhiteBox$WhiteBoxPermission * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions @@ -37,8 +37,8 @@ import sha.predicate.IntrinsicPredicates; * -XX:+LogCompilation -XX:LogFile=positive_384.log * -XX:CompileOnly=sun/security/provider/DigestBase * -XX:CompileOnly=sun/security/provider/SHA - * -XX:+UseSHA512Intrinsics -XX:-UseSHA1Intrinsics - * -XX:-UseSHA256Intrinsics + * -XX:+UseSHA1Intrinsics -XX:-UseMD5Intrinsics + * -XX:-UseSHA256Intrinsics -XX:-UseSHA512Intrinsics * -Dalgorithm=SHA-384 TestSHA512MultiBlockIntrinsics * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions * -XX:+WhiteBoxAPI -Xbatch -XX:CompileThreshold=500 @@ -61,8 +61,8 @@ import sha.predicate.IntrinsicPredicates; * -XX:+LogCompilation -XX:LogFile=positive_512.log * -XX:CompileOnly=sun/security/provider/DigestBase * -XX:CompileOnly=sun/security/provider/SHA - * -XX:+UseSHA512Intrinsics -XX:-UseSHA1Intrinsics - * -XX:-UseSHA256Intrinsics + * -XX:+UseSHA1Intrinsics -XX:-UseMD5Intrinsics + * -XX:-UseSHA256Intrinsics -XX:-UseSHA512Intrinsics * -Dalgorithm=SHA-512 TestSHA512MultiBlockIntrinsics * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions * -XX:+WhiteBoxAPI -Xbatch -XX:CompileThreshold=500 @@ -86,7 +86,7 @@ import sha.predicate.IntrinsicPredicates; */ public class TestSHA512MultiBlockIntrinsics { public static void main(String args[]) throws Exception { - new SHASanityTestBase(IntrinsicPredicates.SHA512_INTRINSICS_AVAILABLE, - SHASanityTestBase.MB_INTRINSIC_ID).test(); + new DigestSanityTestBase(IntrinsicPredicates.SHA512_INTRINSICS_AVAILABLE, + DigestSanityTestBase.MB_INTRINSIC_ID).test(); } } diff --git a/hotspot/test/compiler/testlibrary/sha/predicate/IntrinsicPredicates.java b/hotspot/test/compiler/testlibrary/sha/predicate/IntrinsicPredicates.java index dc8c39840..ec4b3e335 100644 --- a/hotspot/test/compiler/testlibrary/sha/predicate/IntrinsicPredicates.java +++ b/hotspot/test/compiler/testlibrary/sha/predicate/IntrinsicPredicates.java @@ -29,6 +29,7 @@ import com.oracle.java.testlibrary.cli.predicate.CPUSpecificPredicate; import com.oracle.java.testlibrary.cli.predicate.OrPredicate; import sun.hotspot.WhiteBox; +import java.lang.reflect.Method; import java.util.function.BooleanSupplier; /** @@ -58,6 +59,13 @@ public class IntrinsicPredicates { return Platform.isServer() && (!isTiered || maxLevelIsReachable); }; + public static final BooleanSupplier MD5_INSTRUCTION_AVAILABLE + = new OrPredicate(new CPUSpecificPredicate("aarch64.*", null, null), + // x86 variants + new OrPredicate(new CPUSpecificPredicate("amd64.*", null, null), + new CPUSpecificPredicate("x86.*", null, null))); + + public static final BooleanSupplier SHA1_INSTRUCTION_AVAILABLE = new OrPredicate( new CPUSpecificPredicate("sparc.*", new String[] { "sha1" }, @@ -92,6 +100,13 @@ public class IntrinsicPredicates { IntrinsicPredicates.SHA256_INSTRUCTION_AVAILABLE, IntrinsicPredicates.SHA512_INSTRUCTION_AVAILABLE)); + public static BooleanSupplier isMD5IntrinsicAvailable() { + return new AndPredicate(new AndPredicate( + IntrinsicPredicates.MD5_INSTRUCTION_AVAILABLE, + IntrinsicPredicates.COMPILABLE_BY_C2), + IntrinsicPredicates.booleanOptionValue("UseMD5Intrinsics")); + } + public static final BooleanSupplier SHA1_INTRINSICS_AVAILABLE = new AndPredicate(new AndPredicate( IntrinsicPredicates.SHA1_INSTRUCTION_AVAILABLE, @@ -116,4 +131,13 @@ public class IntrinsicPredicates { private IntrinsicPredicates() { } + + private static BooleanSupplier isIntrinsicAvailable(String klass, String method) { + try { + Method m = Class.forName(klass).getDeclaredMethod(method, byte[].class, int.class); + return () -> WHITE_BOX.isIntrinsicAvailable(m, (int)IntrinsicPredicates.TIERED_MAX_LEVEL); + } catch (Exception e) { + throw new RuntimeException("Intrinsified method " + klass + "::" + method + " not found!"); + } + }; } diff --git a/jdk/src/share/classes/sun/security/provider/MD5.java b/jdk/src/share/classes/sun/security/provider/MD5.java index c168ace71..a530e7a58 100644 --- a/jdk/src/share/classes/sun/security/provider/MD5.java +++ b/jdk/src/share/classes/sun/security/provider/MD5.java @@ -26,6 +26,7 @@ package sun.security.provider; import java.util.Arrays; +import java.util.Objects; import static sun.security.provider.ByteArrayAccess.*; @@ -147,8 +148,26 @@ public final class MD5 extends DigestBase { * bytes from the buffer, beginning at the specified offset. */ void implCompress(byte[] buf, int ofs) { + implCompressCheck(buf, ofs); + implCompress0(buf, ofs); + } + + private void implCompressCheck(byte[] buf, int ofs) { + Objects.requireNonNull(buf); + + // The checks performed by the method 'b2iBig64' + // are sufficient for the case when the method + // 'implCompressImpl' is replaced with a compiler + // intrinsic. b2iLittle64(buf, ofs, x); + } + // The method 'implCompress0 seems not to use its parameters. + // The method can, however, be replaced with a compiler intrinsic + // that operates directly on the array 'buf' (starting from + // offset 'ofs') and not on array 'x', therefore 'buf' and 'ofs' + // must be passed as parameter to the method. + void implCompress0(byte[] buf, int ofs) { int a = state[0]; int b = state[1]; int c = state[2]; diff --git a/jdk/src/share/classes/sun/security/provider/SHA.java b/jdk/src/share/classes/sun/security/provider/SHA.java index dfa477adf..b96f19e5b 100644 --- a/jdk/src/share/classes/sun/security/provider/SHA.java +++ b/jdk/src/share/classes/sun/security/provider/SHA.java @@ -134,12 +134,12 @@ public final class SHA extends DigestBase { // The checks performed by the method 'b2iBig64' // are sufficient for the case when the method - // 'implCompressImpl' is replaced with a compiler + // 'implCompress0' is replaced with a compiler // intrinsic. b2iBig64(buf, ofs, W); } - // The method 'implCompressImpl seems not to use its parameters. + // The method 'implCompress0 seems not to use its parameters. // The method can, however, be replaced with a compiler intrinsic // that operates directly on the array 'buf' (starting from // offset 'ofs') and not on array 'W', therefore 'buf' and 'ofs' -- 2.22.0
Locations
Projects
Search
Status Monitor
Help
Open Build Service
OBS Manuals
API Documentation
OBS Portal
Reporting a Bug
Contact
Mailing List
Forums
Chat (IRC)
Twitter
Open Build Service (OBS)
is an
openSUSE project
.
浙ICP备2022010568号-2