< prev index next >

src/cpu/ppc/vm/stubGenerator_ppc.cpp

Print this page
rev 11916 : 8164920: ppc: enhancement of CRC32 intrinsic

*** 3203,3214 **** // 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_ARG4; // crc table address const Register t0 = R2; const Register t1 = R7; const Register t2 = R8; const Register t3 = R9; const Register tc0 = R10; --- 3203,3243 ---- // 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 + + #ifdef VM_LITTLE_ENDIAN + 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_vpmsumd(crc, data, dataLen, table, constants, bconstants, t0, t1, t2, t3, t4); + + 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 + #endif + { const Register t0 = R2; const Register t1 = R7; const Register t2 = R8; const Register t3 = R9; const Register tc0 = R10;
*** 3225,3234 **** --- 3254,3265 ---- 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"); + } + return start; } // Initialization void generate_initial() {
< prev index next >