@@ -105,7 +105,7 @@ class RegisterSaver {
105105
106106 // During deoptimization only the result registers need to be restored
107107 // all the other values have already been extracted.
108- static void restore_result_registers (MacroAssembler* masm, int frame_size_in_bytes);
108+ static void restore_result_registers (MacroAssembler* masm, int frame_size_in_bytes, bool save_vectors );
109109
110110 // Constants and data structures:
111111
@@ -355,6 +355,7 @@ OopMap* RegisterSaver::push_frame_reg_args_and_save_live_registers(MacroAssemble
355355 __ li (R30, offset);
356356 __ stxvd2x (as_VectorSRegister (reg_num), R30, R1_SP);
357357
358+ // RegisterMap::pd_location only uses the first VMReg for each VectorRegister.
358359 if (generate_oop_map) {
359360 map->set_callee_saved (VMRegImpl::stack2reg (offset>>2 ),
360361 RegisterSaver_LiveVSRegs[i].vmreg );
@@ -528,10 +529,14 @@ void RegisterSaver::restore_argument_registers_and_pop_frame(MacroAssembler*masm
528529}
529530
530531// Restore the registers that might be holding a result.
531- void RegisterSaver::restore_result_registers (MacroAssembler* masm, int frame_size_in_bytes) {
532+ void RegisterSaver::restore_result_registers (MacroAssembler* masm, int frame_size_in_bytes, bool save_vectors ) {
532533 const int regstosave_num = sizeof (RegisterSaver_LiveRegs) /
533534 sizeof (RegisterSaver::LiveRegType);
534- const int register_save_size = regstosave_num * reg_size; // VS registers not relevant here.
535+ const int vecregstosave_num = save_vectors ? (sizeof (RegisterSaver_LiveVSRegs) /
536+ sizeof (RegisterSaver::LiveRegType))
537+ : 0 ;
538+ const int register_save_size = regstosave_num * reg_size + vecregstosave_num * vs_reg_size;
539+
535540 const int register_save_offset = frame_size_in_bytes - register_save_size;
536541
537542 // restore all result registers (ints and floats)
@@ -560,7 +565,7 @@ void RegisterSaver::restore_result_registers(MacroAssembler* masm, int frame_siz
560565 offset += reg_size;
561566 }
562567
563- assert (offset == frame_size_in_bytes, " consistency check" );
568+ assert (offset == frame_size_in_bytes - (save_vectors ? vecregstosave_num * vs_reg_size : 0 ) , " consistency check" );
564569}
565570
566571// Is vector's size (in bytes) bigger than a size saved by default?
@@ -2984,7 +2989,8 @@ void SharedRuntime::generate_deopt_blob() {
29842989 &first_frame_size_in_bytes,
29852990 /* generate_oop_map=*/ true ,
29862991 return_pc_adjustment_no_exception,
2987- RegisterSaver::return_pc_is_lr);
2992+ RegisterSaver::return_pc_is_lr,
2993+ /* save_vectors*/ SuperwordUseVSX);
29882994 assert (map != nullptr , " OopMap must have been created" );
29892995
29902996 __ li (exec_mode_reg, Deoptimization::Unpack_deopt);
@@ -3019,7 +3025,8 @@ void SharedRuntime::generate_deopt_blob() {
30193025 &first_frame_size_in_bytes,
30203026 /* generate_oop_map=*/ false ,
30213027 /* return_pc_adjustment_exception=*/ 0 ,
3022- RegisterSaver::return_pc_is_pre_saved);
3028+ RegisterSaver::return_pc_is_pre_saved,
3029+ /* save_vectors*/ SuperwordUseVSX);
30233030
30243031 // Deopt during an exception. Save exec mode for unpack_frames.
30253032 __ li (exec_mode_reg, Deoptimization::Unpack_exception);
@@ -3037,7 +3044,8 @@ void SharedRuntime::generate_deopt_blob() {
30373044 &first_frame_size_in_bytes,
30383045 /* generate_oop_map=*/ false ,
30393046 /* return_pc_adjustment_reexecute=*/ 0 ,
3040- RegisterSaver::return_pc_is_pre_saved);
3047+ RegisterSaver::return_pc_is_pre_saved,
3048+ /* save_vectors*/ SuperwordUseVSX);
30413049 __ li (exec_mode_reg, Deoptimization::Unpack_reexecute);
30423050#endif
30433051
@@ -3063,7 +3071,7 @@ void SharedRuntime::generate_deopt_blob() {
30633071
30643072 // Restore only the result registers that have been saved
30653073 // by save_volatile_registers(...).
3066- RegisterSaver::restore_result_registers (masm, first_frame_size_in_bytes);
3074+ RegisterSaver::restore_result_registers (masm, first_frame_size_in_bytes, /* save_vectors */ SuperwordUseVSX );
30673075
30683076 // reload the exec mode from the UnrollBlock (it might have changed)
30693077 __ lwz (exec_mode_reg, in_bytes (Deoptimization::UnrollBlock::unpack_kind_offset ()), unroll_block_reg);
0 commit comments