847 address InterpreterGenerator::generate_CRC32_update_entry() { |
847 address InterpreterGenerator::generate_CRC32_update_entry() { |
848 if (UseCRC32Intrinsics) { |
848 if (UseCRC32Intrinsics) { |
849 address entry = __ pc(); |
849 address entry = __ pc(); |
850 |
850 |
851 // rbx,: Method* |
851 // rbx,: Method* |
852 // rsi: senderSP must preserved for slow path, set SP to it on fast path |
852 // r13: senderSP must preserved for slow path, set SP to it on fast path |
853 // rdx: scratch |
853 // c_rarg0: scratch (rdi on non-Win64, rcx on Win64) |
854 // rdi: scratch |
854 // c_rarg1: scratch (rsi on non-Win64, rdx on Win64) |
855 |
855 |
856 Label slow_path; |
856 Label slow_path; |
857 // If we need a safepoint check, generate full interpreter entry. |
857 // If we need a safepoint check, generate full interpreter entry. |
858 ExternalAddress state(SafepointSynchronize::address_of_state()); |
858 ExternalAddress state(SafepointSynchronize::address_of_state()); |
859 __ cmp32(ExternalAddress(SafepointSynchronize::address_of_state()), |
859 __ cmp32(ExternalAddress(SafepointSynchronize::address_of_state()), |
863 // We don't generate local frame and don't align stack because |
863 // We don't generate local frame and don't align stack because |
864 // we call stub code and there is no safepoint on this path. |
864 // we call stub code and there is no safepoint on this path. |
865 |
865 |
866 // Load parameters |
866 // Load parameters |
867 const Register crc = rax; // crc |
867 const Register crc = rax; // crc |
868 const Register val = rdx; // source java byte value |
868 const Register val = c_rarg0; // source java byte value |
869 const Register tbl = rdi; // scratch |
869 const Register tbl = c_rarg1; // scratch |
870 |
870 |
871 // Arguments are reversed on java expression stack |
871 // Arguments are reversed on java expression stack |
872 __ movl(val, Address(rsp, wordSize)); // byte value |
872 __ movl(val, Address(rsp, wordSize)); // byte value |
873 __ movl(crc, Address(rsp, 2*wordSize)); // Initial CRC |
873 __ movl(crc, Address(rsp, 2*wordSize)); // Initial CRC |
874 |
874 |
917 |
917 |
918 // Load parameters |
918 // Load parameters |
919 const Register crc = c_rarg0; // crc |
919 const Register crc = c_rarg0; // crc |
920 const Register buf = c_rarg1; // source java byte array address |
920 const Register buf = c_rarg1; // source java byte array address |
921 const Register len = c_rarg2; // length |
921 const Register len = c_rarg2; // length |
|
922 const Register off = len; // offset (never overlaps with 'len') |
922 |
923 |
923 // Arguments are reversed on java expression stack |
924 // Arguments are reversed on java expression stack |
924 __ movl(len, Address(rsp, wordSize)); // Length |
|
925 // Calculate address of start element |
925 // Calculate address of start element |
926 if (kind == Interpreter::java_util_zip_CRC32_updateByteBuffer) { |
926 if (kind == Interpreter::java_util_zip_CRC32_updateByteBuffer) { |
927 __ movptr(buf, Address(rsp, 3*wordSize)); // long buf |
927 __ movptr(buf, Address(rsp, 3*wordSize)); // long buf |
928 __ addptr(buf, Address(rsp, 2*wordSize)); // + offset |
928 __ movl2ptr(off, Address(rsp, 2*wordSize)); // offset |
|
929 __ addq(buf, off); // + offset |
929 __ movl(crc, Address(rsp, 5*wordSize)); // Initial CRC |
930 __ movl(crc, Address(rsp, 5*wordSize)); // Initial CRC |
930 } else { |
931 } else { |
931 __ movptr(buf, Address(rsp, 3*wordSize)); // byte[] array |
932 __ movptr(buf, Address(rsp, 3*wordSize)); // byte[] array |
932 __ addptr(buf, arrayOopDesc::base_offset_in_bytes(T_BYTE)); // + header size |
933 __ addptr(buf, arrayOopDesc::base_offset_in_bytes(T_BYTE)); // + header size |
933 __ addptr(buf, Address(rsp, 2*wordSize)); // + offset |
934 __ movl2ptr(off, Address(rsp, 2*wordSize)); // offset |
|
935 __ addq(buf, off); // + offset |
934 __ movl(crc, Address(rsp, 4*wordSize)); // Initial CRC |
936 __ movl(crc, Address(rsp, 4*wordSize)); // Initial CRC |
935 } |
937 } |
|
938 // Can now load 'len' since we're finished with 'off' |
|
939 __ movl(len, Address(rsp, wordSize)); // Length |
936 |
940 |
937 __ super_call_VM_leaf(CAST_FROM_FN_PTR(address, StubRoutines::updateBytesCRC32()), crc, buf, len); |
941 __ super_call_VM_leaf(CAST_FROM_FN_PTR(address, StubRoutines::updateBytesCRC32()), crc, buf, len); |
938 // result in rax |
942 // result in rax |
939 |
943 |
940 // _areturn |
944 // _areturn |