diff a/src/hotspot/cpu/x86/stubGenerator_x86_32.cpp b/src/hotspot/cpu/x86/stubGenerator_x86_32.cpp --- a/src/hotspot/cpu/x86/stubGenerator_x86_32.cpp +++ b/src/hotspot/cpu/x86/stubGenerator_x86_32.cpp @@ -2914,10 +2914,50 @@ __ jmp(L_multiBlock_loopTop[2]); //key192 return start; } + // ofs and limit are use for multi-block byte array. + // int com.sun.security.provider.MD5.implCompress(byte[] b, int ofs) + address generate_md5_implCompress(bool multi_block, const char *name) { + __ align(CodeEntryAlignment); + StubCodeMark mark(this, "StubRoutines", name); + address start = __ pc(); + + const Register buf_param = rbp; + const Address state_param(rsp, 0 * wordSize); + const Address ofs_param (rsp, 1 * wordSize); + const Address limit_param(rsp, 2 * wordSize); + + __ enter(); + __ push(rbx); + __ push(rdi); + __ push(rsi); + __ push(rbp); + __ subptr(rsp, 3 * wordSize); + + __ movptr(rsi, Address(rbp, 8 + 4)); + __ movptr(state_param, rsi); + if (multi_block) { + __ movptr(rsi, Address(rbp, 8 + 8)); + __ movptr(ofs_param, rsi); + __ movptr(rsi, Address(rbp, 8 + 12)); + __ movptr(limit_param, rsi); + } + __ movptr(buf_param, Address(rbp, 8 + 0)); // do it last because it override rbp + __ fast_md5(buf_param, state_param, ofs_param, limit_param, multi_block); + + __ addptr(rsp, 3 * wordSize); + __ pop(rbp); + __ pop(rsi); + __ pop(rdi); + __ pop(rbx); + __ leave(); + __ ret(0); + return start; + } + address generate_upper_word_mask() { __ align(64); StubCodeMark mark(this, "StubRoutines", "upper_word_mask"); address start = __ pc(); __ emit_data(0x00000000, relocInfo::none, 0); @@ -3919,10 +3959,14 @@ if (UseAESCTRIntrinsics) { StubRoutines::x86::_counter_shuffle_mask_addr = generate_counter_shuffle_mask(); StubRoutines::_counterMode_AESCrypt = generate_counterMode_AESCrypt_Parallel(); } + if (UseMD5Intrinsics) { + StubRoutines::_md5_implCompress = generate_md5_implCompress(false, "md5_implCompress"); + StubRoutines::_md5_implCompressMB = generate_md5_implCompress(true, "md5_implCompressMB"); + } if (UseSHA1Intrinsics) { StubRoutines::x86::_upper_word_mask_addr = generate_upper_word_mask(); StubRoutines::x86::_shuffle_byte_flip_mask_addr = generate_shuffle_byte_flip_mask(); StubRoutines::_sha1_implCompress = generate_sha1_implCompress(false, "sha1_implCompress"); StubRoutines::_sha1_implCompressMB = generate_sha1_implCompress(true, "sha1_implCompressMB");