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() {