< prev index next >

src/cpu/x86/vm/stubGenerator_x86_64.cpp

Print this page

        

@@ -3893,10 +3893,68 @@
     __ ret(0);
 
     return start;
   }
 
+  /**
+  *  Arguments:
+  *
+  * Inputs:
+  *   c_rarg0   - int crc
+  *   c_rarg1   - byte* buf
+  *   c_rarg2   - long length
+  *   c_rarg3   - table_start - optional (present only when doing a library_calll, 
+  *              not used by x86 algorithm)
+  *
+  * Ouput:
+  *       rax   - int crc result
+  */
+  address generate_updateBytesCRC32C(bool IsPclmulqdqSupported) {
+      assert(UseCRC32CIntrinsics, "need SSE4_2");
+      __ align(CodeEntryAlignment);
+      StubCodeMark mark(this, "StubRoutines", "updateBytesCRC32C");
+      address start = __ pc();
+      //reg.arg        int#0        int#1        int#2        int#3        int#4        int#5        float regs
+      //Windows        RCX          RDX          R8           R9           none         none         XMM0..XMM3
+      //Lin / Sol      RDI          RSI          RDX          RCX          R8           R9           XMM0..XMM7
+      const Register crc = c_rarg0;  // crc
+      const Register buf = c_rarg1;  // source java byte array address
+      const Register len = c_rarg2;  // length
+      const Register A = rax;
+      const Register J = r9;
+      const Register K = r10;
+      const Register L = r11;
+#ifdef _WIN64
+      const Register Y = rdi;
+      const Register Z = rsi;
+#else
+      const Register Y = rcx;
+      const Register Z = r8;
+#endif
+      assert_different_registers(crc, buf, len, A, J, K, L, Y, Z);
+
+      BLOCK_COMMENT("Entry:");
+      __ enter(); // required for proper stackwalking of RuntimeStub frame
+#ifdef _WIN64
+      __ push(Y);
+      __ push(Z);
+#endif
+      __ crc32c_IPL_Alg2Alt2Fast(crc, buf, len,
+                                 A, J, K,
+                                 L, Y, Z,
+                                 c_farg0, c_farg1, c_farg2,
+                                 IsPclmulqdqSupported);
+      __ movl(rax, crc);
+#ifdef _WIN64
+      __ pop(Z);
+      __ pop(Y);
+#endif
+      __ leave(); // required for proper stackwalking of RuntimeStub frame
+      __ ret(0);
+
+      return start;
+  }
 
   /**
    *  Arguments:
    *
    *  Input:

@@ -4237,10 +4295,17 @@
     if (UseCRC32Intrinsics) {
       // set table address before stub generation which use it
       StubRoutines::_crc_table_adr = (address)StubRoutines::x86::_crc_table;
       StubRoutines::_updateBytesCRC32 = generate_updateBytesCRC32();
     }
+
+    if (UseCRC32CIntrinsics) {
+      bool supports_clmul;
+      StubRoutines::x86::GenerateCRC32CTable(supports_clmul = VM_Version::supports_clmul());
+      StubRoutines::_crc32c_table_addr = (address)StubRoutines::x86::_crc32c_table;
+      StubRoutines::_updateBytesCRC32C = generate_updateBytesCRC32C(supports_clmul);
+    }
   }
 
   void generate_all() {
     // Generates all stubs and initializes the entry points
 
< prev index next >