@@ -100,7 +100,7 @@ class RegisterSaver {
100100
101101 // During deoptimization only the result registers need to be restored
102102 // all the other values have already been extracted.
103- static void restore_result_registers (MacroAssembler* masm, int frame_size_in_bytes);
103+ static void restore_result_registers (MacroAssembler* masm, int frame_size_in_bytes, bool save_vectors );
104104
105105 // Constants and data structures:
106106
@@ -350,6 +350,7 @@ OopMap* RegisterSaver::push_frame_reg_args_and_save_live_registers(MacroAssemble
350350 __ li (R30, offset);
351351 __ stxvd2x (as_VectorSRegister (reg_num), R30, R1_SP);
352352
353+ // RegisterMap::pd_location only uses the first VMReg for each VectorRegister.
353354 if (generate_oop_map) {
354355 map->set_callee_saved (VMRegImpl::stack2reg (offset>>2 ),
355356 RegisterSaver_LiveVSRegs[i].vmreg );
@@ -523,10 +524,14 @@ void RegisterSaver::restore_argument_registers_and_pop_frame(MacroAssembler*masm
523524}
524525
525526// Restore the registers that might be holding a result.
526- void RegisterSaver::restore_result_registers (MacroAssembler* masm, int frame_size_in_bytes) {
527+ void RegisterSaver::restore_result_registers (MacroAssembler* masm, int frame_size_in_bytes, bool save_vectors ) {
527528 const int regstosave_num = sizeof (RegisterSaver_LiveRegs) /
528529 sizeof (RegisterSaver::LiveRegType);
529- const int register_save_size = regstosave_num * reg_size; // VS registers not relevant here.
530+ const int vecregstosave_num = save_vectors ? (sizeof (RegisterSaver_LiveVSRegs) /
531+ sizeof (RegisterSaver::LiveRegType))
532+ : 0 ;
533+ const int register_save_size = regstosave_num * reg_size + vecregstosave_num * vs_reg_size;
534+
530535 const int register_save_offset = frame_size_in_bytes - register_save_size;
531536
532537 // restore all result registers (ints and floats)
@@ -555,7 +560,7 @@ void RegisterSaver::restore_result_registers(MacroAssembler* masm, int frame_siz
555560 offset += reg_size;
556561 }
557562
558- assert (offset == frame_size_in_bytes, " consistency check" );
563+ assert (offset == frame_size_in_bytes - (save_vectors ? vecregstosave_num * vs_reg_size : 0 ) , " consistency check" );
559564}
560565
561566// Is vector's size (in bytes) bigger than a size saved by default?
@@ -2701,7 +2706,8 @@ void SharedRuntime::generate_deopt_blob() {
27012706 &first_frame_size_in_bytes,
27022707 /* generate_oop_map=*/ true ,
27032708 return_pc_adjustment_no_exception,
2704- RegisterSaver::return_pc_is_lr);
2709+ RegisterSaver::return_pc_is_lr,
2710+ /* save_vectors*/ SuperwordUseVSX);
27052711 assert (map != NULL , " OopMap must have been created" );
27062712
27072713 __ li (exec_mode_reg, Deoptimization::Unpack_deopt);
@@ -2736,7 +2742,8 @@ void SharedRuntime::generate_deopt_blob() {
27362742 &first_frame_size_in_bytes,
27372743 /* generate_oop_map=*/ false ,
27382744 /* return_pc_adjustment_exception=*/ 0 ,
2739- RegisterSaver::return_pc_is_pre_saved);
2745+ RegisterSaver::return_pc_is_pre_saved,
2746+ /* save_vectors*/ SuperwordUseVSX);
27402747
27412748 // Deopt during an exception. Save exec mode for unpack_frames.
27422749 __ li (exec_mode_reg, Deoptimization::Unpack_exception);
@@ -2754,7 +2761,8 @@ void SharedRuntime::generate_deopt_blob() {
27542761 &first_frame_size_in_bytes,
27552762 /* generate_oop_map=*/ false ,
27562763 /* return_pc_adjustment_reexecute=*/ 0 ,
2757- RegisterSaver::return_pc_is_pre_saved);
2764+ RegisterSaver::return_pc_is_pre_saved,
2765+ /* save_vectors*/ SuperwordUseVSX);
27582766 __ li (exec_mode_reg, Deoptimization::Unpack_reexecute);
27592767#endif
27602768
@@ -2781,7 +2789,7 @@ void SharedRuntime::generate_deopt_blob() {
27812789
27822790 // Restore only the result registers that have been saved
27832791 // by save_volatile_registers(...).
2784- RegisterSaver::restore_result_registers (masm, first_frame_size_in_bytes);
2792+ RegisterSaver::restore_result_registers (masm, first_frame_size_in_bytes, /* save_vectors */ SuperwordUseVSX );
27852793
27862794 // reload the exec mode from the UnrollBlock (it might have changed)
27872795 __ lwz (exec_mode_reg, Deoptimization::UnrollBlock::unpack_kind_offset_in_bytes (), unroll_block_reg);
0 commit comments