--- old/src/cpu/x86/vm/stubGenerator_x86_64.cpp 2015-08-26 13:22:25.091257100 -0700 +++ new/src/cpu/x86/vm/stubGenerator_x86_64.cpp 2015-08-26 13:22:24.815229500 -0700 @@ -3895,6 +3895,64 @@ 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: @@ -4239,6 +4297,13 @@ 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() {