< prev index next >

src/hotspot/cpu/x86/stubGenerator_x86_32.cpp

Print this page
*** 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");
< prev index next >