< prev index next >
src/hotspot/cpu/ppc/stubGenerator_ppc.cpp
Print this page
rev 53130 : 8216060: [PPC64] Vector CRC implementation should be used by interpreter and be faster for short arrays
Reviewed-by: gromero
*** 3186,3214 ****
return start;
}
// Compute CRC32/CRC32C function.
! void generate_CRC_updateBytes(const char* name, Register table, bool invertCRC) {
// arguments to kernel_crc32:
const Register crc = R3_ARG1; // Current checksum, preset by caller or result from previous call.
const Register data = R4_ARG2; // source byte array
const Register dataLen = R5_ARG3; // #bytes to process
- const Register t0 = R2;
- const Register t1 = R7;
- const Register t2 = R8;
- const Register t3 = R9;
- const Register tc0 = R10;
- const Register tc1 = R11;
- const Register tc2 = R12;
-
BLOCK_COMMENT("Stub body {");
assert_different_registers(crc, data, dataLen, table);
! __ kernel_crc32_1word(crc, data, dataLen, table, t0, t1, t2, t3, tc0, tc1, tc2, table, invertCRC);
BLOCK_COMMENT("return");
__ mr_if_needed(R3_RET, crc); // Updated crc is function result. No copying required (R3_ARG1 == R3_RET).
__ blr();
--- 3186,3210 ----
return start;
}
// Compute CRC32/CRC32C function.
! void generate_CRC_updateBytes(const char* name, Register table, Register vector_constants, bool invertCRC) {
// arguments to kernel_crc32:
const Register crc = R3_ARG1; // Current checksum, preset by caller or result from previous call.
const Register data = R4_ARG2; // source byte array
const Register dataLen = R5_ARG3; // #bytes to process
BLOCK_COMMENT("Stub body {");
assert_different_registers(crc, data, dataLen, table);
! if (vector_constants == noreg) {
! __ kernel_crc32_1word(crc, data, dataLen, table, R2, R7, R8, R9, R10, R11, R12, table, invertCRC);
! } else {
! __ kernel_crc32_vpmsum(crc, data, dataLen, table, vector_constants, R7, R8, R9, R10, R11, R12, invertCRC);
! }
BLOCK_COMMENT("return");
__ mr_if_needed(R3_RET, crc); // Updated crc is function result. No copying required (R3_ARG1 == R3_RET).
__ blr();
*** 3495,3540 ****
address generate_CRC32_updateBytes(const char* name) {
__ align(CodeEntryAlignment);
StubCodeMark mark(this, "StubRoutines", name);
address start = __ function_entry(); // Remember stub start address (is rtn value).
- const Register table = R6; // crc table address
-
// arguments to kernel_crc32:
const Register crc = R3_ARG1; // Current checksum, preset by caller or result from previous call.
const Register data = R4_ARG2; // source byte array
const Register dataLen = R5_ARG3; // #bytes to process
! if (VM_Version::has_vpmsumb()) {
! const Register constants = R2; // constants address
! const Register bconstants = R8; // barret table address
!
! const Register t0 = R9;
! const Register t1 = R10;
! const Register t2 = R11;
! const Register t3 = R12;
! const Register t4 = R7;
!
! BLOCK_COMMENT("Stub body {");
! assert_different_registers(crc, data, dataLen, table);
!
! StubRoutines::ppc64::generate_load_crc_table_addr(_masm, table);
! StubRoutines::ppc64::generate_load_crc_constants_addr(_masm, constants);
! StubRoutines::ppc64::generate_load_crc_barret_constants_addr(_masm, bconstants);
!
! __ kernel_crc32_1word_vpmsum(crc, data, dataLen, table, constants, bconstants, t0, t1, t2, t3, t4, true);
!
! BLOCK_COMMENT("return");
! __ mr_if_needed(R3_RET, crc); // Updated crc is function result. No copying required (R3_ARG1 == R3_RET).
! __ blr();
- BLOCK_COMMENT("} Stub body");
- } else {
StubRoutines::ppc64::generate_load_crc_table_addr(_masm, table);
! generate_CRC_updateBytes(name, table, true);
}
!
return start;
}
/**
--- 3491,3514 ----
address generate_CRC32_updateBytes(const char* name) {
__ align(CodeEntryAlignment);
StubCodeMark mark(this, "StubRoutines", name);
address start = __ function_entry(); // Remember stub start address (is rtn value).
// arguments to kernel_crc32:
const Register crc = R3_ARG1; // Current checksum, preset by caller or result from previous call.
const Register data = R4_ARG2; // source byte array
const Register dataLen = R5_ARG3; // #bytes to process
! const Register table = R6; // crc table address
! Register vector_constants = noreg;
StubRoutines::ppc64::generate_load_crc_table_addr(_masm, table);
! if (VM_Version::has_vpmsumb()) {
! vector_constants = R2;
! StubRoutines::ppc64::generate_load_crc_constants_addr(_masm, vector_constants);
}
! generate_CRC_updateBytes(name, table, vector_constants, true);
return start;
}
/**
*** 3555,3600 ****
address generate_CRC32C_updateBytes(const char* name) {
__ align(CodeEntryAlignment);
StubCodeMark mark(this, "StubRoutines", name);
address start = __ function_entry(); // Remember stub start address (is rtn value).
- const Register table = R6; // crc table address
-
// arguments to kernel_crc32:
const Register crc = R3_ARG1; // Current checksum, preset by caller or result from previous call.
const Register data = R4_ARG2; // source byte array
const Register dataLen = R5_ARG3; // #bytes to process
! if (VM_Version::has_vpmsumb()) {
! const Register constants = R2; // constants address
! const Register bconstants = R8; // barret table address
!
! const Register t0 = R9;
! const Register t1 = R10;
! const Register t2 = R11;
! const Register t3 = R12;
! const Register t4 = R7;
!
! BLOCK_COMMENT("Stub body {");
! assert_different_registers(crc, data, dataLen, table);
!
! StubRoutines::ppc64::generate_load_crc32c_table_addr(_masm, table);
! StubRoutines::ppc64::generate_load_crc32c_constants_addr(_masm, constants);
! StubRoutines::ppc64::generate_load_crc32c_barret_constants_addr(_masm, bconstants);
!
! __ kernel_crc32_1word_vpmsum(crc, data, dataLen, table, constants, bconstants, t0, t1, t2, t3, t4, false);
!
! BLOCK_COMMENT("return");
! __ mr_if_needed(R3_RET, crc); // Updated crc is function result. No copying required (R3_ARG1 == R3_RET).
! __ blr();
- BLOCK_COMMENT("} Stub body");
- } else {
StubRoutines::ppc64::generate_load_crc32c_table_addr(_masm, table);
! generate_CRC_updateBytes(name, table, false);
}
!
return start;
}
// Initialization
--- 3529,3552 ----
address generate_CRC32C_updateBytes(const char* name) {
__ align(CodeEntryAlignment);
StubCodeMark mark(this, "StubRoutines", name);
address start = __ function_entry(); // Remember stub start address (is rtn value).
// arguments to kernel_crc32:
const Register crc = R3_ARG1; // Current checksum, preset by caller or result from previous call.
const Register data = R4_ARG2; // source byte array
const Register dataLen = R5_ARG3; // #bytes to process
! const Register table = R6; // crc table address
! Register vector_constants = noreg;
StubRoutines::ppc64::generate_load_crc32c_table_addr(_masm, table);
! if (VM_Version::has_vpmsumb()) {
! vector_constants = R2;
! StubRoutines::ppc64::generate_load_crc32c_constants_addr(_masm, vector_constants);
}
! generate_CRC_updateBytes(name, table, vector_constants, false);
return start;
}
// Initialization
< prev index next >