Mercurial > hg > truffle
comparison src/cpu/sparc/vm/stubGenerator_sparc.cpp @ 17954:0342d80559e0
8043274: Test compiler/7184394/TestAESMain.java gets NPE on solaris
Summary: save cipher len after registers are saved
Reviewed-by: kvn
Contributed-by: shrinivas.joshi@oracle.com
author | kvn |
---|---|
date | Wed, 21 May 2014 12:16:41 -0700 |
parents | 0fb5b60ab4a2 |
children | 52b4284cb496 b20a35eae442 |
comparison
equal
deleted
inserted
replaced
17953:273a462437e9 | 17954:0342d80559e0 |
---|---|
3651 Register key = I2; // expanded key array | 3651 Register key = I2; // expanded key array |
3652 Register rvec = I3; // init vector | 3652 Register rvec = I3; // init vector |
3653 const Register len_reg = I4; // cipher length | 3653 const Register len_reg = I4; // cipher length |
3654 const Register keylen = I5; // reg for storing expanded key array length | 3654 const Register keylen = I5; // reg for storing expanded key array length |
3655 | 3655 |
3656 // save cipher len before save_frame, to return in the end | |
3657 __ mov(O4, L0); | |
3658 __ save_frame(0); | 3656 __ save_frame(0); |
3657 // save cipher len to return in the end | |
3658 __ mov(len_reg, L0); | |
3659 | 3659 |
3660 // read expanded key length | 3660 // read expanded key length |
3661 __ ldsw(Address(key, arrayOopDesc::length_offset_in_bytes() - arrayOopDesc::base_offset_in_bytes(T_INT)), keylen, 0); | 3661 __ ldsw(Address(key, arrayOopDesc::length_offset_in_bytes() - arrayOopDesc::base_offset_in_bytes(T_INT)), keylen, 0); |
3662 | 3662 |
3663 // load initial vector, 8-byte alignment is guranteed | 3663 // load initial vector, 8-byte alignment is guranteed |
3776 __ br(Assembler::notEqual, false, Assembler::pt, L_cbcenc128); | 3776 __ br(Assembler::notEqual, false, Assembler::pt, L_cbcenc128); |
3777 __ delayed()->nop(); | 3777 __ delayed()->nop(); |
3778 // re-init intial vector for next block, 8-byte alignment is guaranteed | 3778 // re-init intial vector for next block, 8-byte alignment is guaranteed |
3779 __ stf(FloatRegisterImpl::D, F60, rvec, 0); | 3779 __ stf(FloatRegisterImpl::D, F60, rvec, 0); |
3780 __ stf(FloatRegisterImpl::D, F62, rvec, 8); | 3780 __ stf(FloatRegisterImpl::D, F62, rvec, 8); |
3781 __ restore(); | 3781 __ mov(L0, I0); |
3782 __ retl(); | 3782 __ ret(); |
3783 __ delayed()->mov(L0, O0); | 3783 __ delayed()->restore(); |
3784 | 3784 |
3785 __ align(OptoLoopAlignment); | 3785 __ align(OptoLoopAlignment); |
3786 __ BIND(L_cbcenc192); | 3786 __ BIND(L_cbcenc192); |
3787 // check for 8-byte alignment since source byte array may have an arbitrary alignment if offset mod 8 is non-zero | 3787 // check for 8-byte alignment since source byte array may have an arbitrary alignment if offset mod 8 is non-zero |
3788 __ andcc(from, 7, G0); | 3788 __ andcc(from, 7, G0); |
3867 __ br(Assembler::notEqual, false, Assembler::pt, L_cbcenc192); | 3867 __ br(Assembler::notEqual, false, Assembler::pt, L_cbcenc192); |
3868 __ delayed()->nop(); | 3868 __ delayed()->nop(); |
3869 // re-init intial vector for next block, 8-byte alignment is guaranteed | 3869 // re-init intial vector for next block, 8-byte alignment is guaranteed |
3870 __ stf(FloatRegisterImpl::D, F60, rvec, 0); | 3870 __ stf(FloatRegisterImpl::D, F60, rvec, 0); |
3871 __ stf(FloatRegisterImpl::D, F62, rvec, 8); | 3871 __ stf(FloatRegisterImpl::D, F62, rvec, 8); |
3872 __ restore(); | 3872 __ mov(L0, I0); |
3873 __ retl(); | 3873 __ ret(); |
3874 __ delayed()->mov(L0, O0); | 3874 __ delayed()->restore(); |
3875 | 3875 |
3876 __ align(OptoLoopAlignment); | 3876 __ align(OptoLoopAlignment); |
3877 __ BIND(L_cbcenc256); | 3877 __ BIND(L_cbcenc256); |
3878 // check for 8-byte alignment since source byte array may have an arbitrary alignment if offset mod 8 is non-zero | 3878 // check for 8-byte alignment since source byte array may have an arbitrary alignment if offset mod 8 is non-zero |
3879 __ andcc(from, 7, G0); | 3879 __ andcc(from, 7, G0); |
3960 __ br(Assembler::notEqual, false, Assembler::pt, L_cbcenc256); | 3960 __ br(Assembler::notEqual, false, Assembler::pt, L_cbcenc256); |
3961 __ delayed()->nop(); | 3961 __ delayed()->nop(); |
3962 // re-init intial vector for next block, 8-byte alignment is guaranteed | 3962 // re-init intial vector for next block, 8-byte alignment is guaranteed |
3963 __ stf(FloatRegisterImpl::D, F60, rvec, 0); | 3963 __ stf(FloatRegisterImpl::D, F60, rvec, 0); |
3964 __ stf(FloatRegisterImpl::D, F62, rvec, 8); | 3964 __ stf(FloatRegisterImpl::D, F62, rvec, 8); |
3965 __ restore(); | 3965 __ mov(L0, I0); |
3966 __ retl(); | 3966 __ ret(); |
3967 __ delayed()->mov(L0, O0); | 3967 __ delayed()->restore(); |
3968 | 3968 |
3969 return start; | 3969 return start; |
3970 } | 3970 } |
3971 | 3971 |
3972 address generate_cipherBlockChaining_decryptAESCrypt_Parallel() { | 3972 address generate_cipherBlockChaining_decryptAESCrypt_Parallel() { |
3990 Register rvec = I3; // init vector | 3990 Register rvec = I3; // init vector |
3991 const Register len_reg = I4; // cipher length | 3991 const Register len_reg = I4; // cipher length |
3992 const Register original_key = I5; // original key array only required during decryption | 3992 const Register original_key = I5; // original key array only required during decryption |
3993 const Register keylen = L6; // reg for storing expanded key array length | 3993 const Register keylen = L6; // reg for storing expanded key array length |
3994 | 3994 |
3995 // save cipher len before save_frame, to return in the end | |
3996 __ mov(O4, L0); | |
3997 __ save_frame(0); //args are read from I* registers since we save the frame in the beginning | 3995 __ save_frame(0); //args are read from I* registers since we save the frame in the beginning |
3996 // save cipher len to return in the end | |
3997 __ mov(len_reg, L7); | |
3998 | 3998 |
3999 // load original key from SunJCE expanded decryption key | 3999 // load original key from SunJCE expanded decryption key |
4000 // Since we load original key buffer starting first element, 8-byte alignment is guaranteed | 4000 // Since we load original key buffer starting first element, 8-byte alignment is guaranteed |
4001 for ( int i = 0; i <= 3; i++ ) { | 4001 for ( int i = 0; i <= 3; i++ ) { |
4002 __ ldf(FloatRegisterImpl::S, original_key, i*4, as_FloatRegister(i)); | 4002 __ ldf(FloatRegisterImpl::S, original_key, i*4, as_FloatRegister(i)); |
4566 | 4566 |
4567 __ BIND(L_cbcdec_end); | 4567 __ BIND(L_cbcdec_end); |
4568 // re-init intial vector for next block, 8-byte alignment is guaranteed | 4568 // re-init intial vector for next block, 8-byte alignment is guaranteed |
4569 __ stx(L0, rvec, 0); | 4569 __ stx(L0, rvec, 0); |
4570 __ stx(L1, rvec, 8); | 4570 __ stx(L1, rvec, 8); |
4571 __ restore(); | 4571 __ mov(L7, I0); |
4572 __ mov(L0, O0); | 4572 __ ret(); |
4573 __ retl(); | 4573 __ delayed()->restore(); |
4574 __ delayed()->nop(); | |
4575 | 4574 |
4576 return start; | 4575 return start; |
4577 } | 4576 } |
4578 | 4577 |
4579 void generate_initial() { | 4578 void generate_initial() { |