< prev index next >
src/hotspot/cpu/ppc/templateInterpreterGenerator_ppc.cpp
Print this page
rev 53463 : 8217459: [PPC64] Cleanup non-vector version of CRC32
Reviewed-by: gromero
*** 1813,1841 ****
// Load java parameters.
// R15_esp is callers operand stack pointer, i.e. it points to the parameters.
const Register argP = R15_esp;
const Register crc = R3_ARG1; // crc value
! const Register data = R4_ARG2; // address of java byte value (kernel_crc32 needs address)
! const Register dataLen = R5_ARG3; // source data len (1 byte). Not used because calling the single-byte emitter.
! const Register table = R6_ARG4; // address of crc32 table
! const Register tmp = dataLen; // Reuse unused len register to show we don't actually need a separate tmp here.
BLOCK_COMMENT("CRC32_update {");
// Arguments are reversed on java expression stack
#ifdef VM_LITTLE_ENDIAN
! __ addi(data, argP, 0+1*wordSize); // (stack) address of byte value. Emitter expects address, not value.
// Being passed as an int, the single byte is at offset +0.
#else
! __ addi(data, argP, 3+1*wordSize); // (stack) address of byte value. Emitter expects address, not value.
// Being passed from java as an int, the single byte is at offset +3.
#endif
__ lwz(crc, 2*wordSize, argP); // Current crc state, zero extend to 64 bit to have a clean register.
!
__ load_const_optimized(table, StubRoutines::crc_table_addr(), R0);
! __ kernel_crc32_singleByte(crc, data, dataLen, table, tmp, true);
// Restore caller sp for c2i case (from compiled) and for resized sender frame (from interpreted).
__ resize_frame_absolute(R21_sender_SP, R11_scratch1, R0);
__ blr();
--- 1813,1839 ----
// Load java parameters.
// R15_esp is callers operand stack pointer, i.e. it points to the parameters.
const Register argP = R15_esp;
const Register crc = R3_ARG1; // crc value
! const Register data = R4_ARG2;
! const Register table = R5_ARG3; // address of crc32 table
BLOCK_COMMENT("CRC32_update {");
// Arguments are reversed on java expression stack
#ifdef VM_LITTLE_ENDIAN
! int data_offs = 0+1*wordSize; // (stack) address of byte value. Emitter expects address, not value.
// Being passed as an int, the single byte is at offset +0.
#else
! int data_offs = 3+1*wordSize; // (stack) address of byte value. Emitter expects address, not value.
// Being passed from java as an int, the single byte is at offset +3.
#endif
__ lwz(crc, 2*wordSize, argP); // Current crc state, zero extend to 64 bit to have a clean register.
! __ lbz(data, data_offs, argP); // Byte from buffer, zero-extended.
__ load_const_optimized(table, StubRoutines::crc_table_addr(), R0);
! __ kernel_crc32_singleByteReg(crc, data, table, true);
// Restore caller sp for c2i case (from compiled) and for resized sender frame (from interpreted).
__ resize_frame_absolute(R21_sender_SP, R11_scratch1, R0);
__ blr();
< prev index next >