< 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 >