@@ -103,7 +103,7 @@ class RegisterSaver {
103103
104104 // During deoptimization only the result registers need to be restored
105105 // all the other values have already been extracted.
106- static void restore_result_registers (MacroAssembler* masm, int frame_size_in_bytes);
106+ static void restore_result_registers (MacroAssembler* masm, int frame_size_in_bytes, bool save_vectors );
107107
108108 // Constants and data structures:
109109
@@ -355,7 +355,7 @@ OopMap* RegisterSaver::push_frame_reg_args_and_save_live_registers(MacroAssemble
355355 }
356356
357357 // Note that generate_oop_map in the following loop is only used for the
358- // polling_page_vectors_safepoint_handler_blob.
358+ // polling_page_vectors_safepoint_handler_blob and the deopt_blob .
359359 // The order in which the vector contents are stored depends on Endianess and
360360 // the utilized instructions (PowerArchitecturePPC64).
361361 assert (is_aligned (offset, StackAlignmentInBytes), " should be" );
@@ -367,6 +367,7 @@ OopMap* RegisterSaver::push_frame_reg_args_and_save_live_registers(MacroAssemble
367367
368368 __ stxvp (as_VectorRegister (reg_num).to_vsr (), offset, R1_SP);
369369 // Note: The contents were read in the same order (see loadV16_Power9 node in ppc.ad).
370+ // RegisterMap::pd_location only uses the first VMReg for each VectorRegister.
370371 if (generate_oop_map) {
371372 map->set_callee_saved (VMRegImpl::stack2reg (offset >> 2 ),
372373 RegisterSaver_LiveVecRegs[i LITTLE_ENDIAN_ONLY (+1 ) ].vmreg );
@@ -386,6 +387,7 @@ OopMap* RegisterSaver::push_frame_reg_args_and_save_live_registers(MacroAssemble
386387 __ stxvd2x (as_VectorRegister (reg_num)->to_vsr (), R31, R1_SP);
387388 }
388389 // Note: The contents were read in the same order (see loadV16_Power8 / loadV16_Power9 node in ppc.ad).
390+ // RegisterMap::pd_location only uses the first VMReg for each VectorRegister.
389391 if (generate_oop_map) {
390392 VMReg vsr = RegisterSaver_LiveVecRegs[i].vmreg ;
391393 map->set_callee_saved (VMRegImpl::stack2reg (offset >> 2 ), vsr);
@@ -572,10 +574,14 @@ void RegisterSaver::restore_argument_registers_and_pop_frame(MacroAssembler*masm
572574}
573575
574576// Restore the registers that might be holding a result.
575- void RegisterSaver::restore_result_registers (MacroAssembler* masm, int frame_size_in_bytes) {
577+ void RegisterSaver::restore_result_registers (MacroAssembler* masm, int frame_size_in_bytes, bool save_vectors ) {
576578 const int regstosave_num = sizeof (RegisterSaver_LiveRegs) /
577579 sizeof (RegisterSaver::LiveRegType);
578- const int register_save_size = regstosave_num * reg_size; // VS registers not relevant here.
580+ const int vecregstosave_num = save_vectors ? (sizeof (RegisterSaver_LiveVecRegs) /
581+ sizeof (RegisterSaver::LiveRegType))
582+ : 0 ;
583+ const int register_save_size = regstosave_num * reg_size + vecregstosave_num * vec_reg_size;
584+
579585 const int register_save_offset = frame_size_in_bytes - register_save_size;
580586
581587 // restore all result registers (ints and floats)
@@ -604,7 +610,7 @@ void RegisterSaver::restore_result_registers(MacroAssembler* masm, int frame_siz
604610 offset += reg_size;
605611 }
606612
607- assert (offset == frame_size_in_bytes, " consistency check" );
613+ assert (offset == frame_size_in_bytes - (save_vectors ? vecregstosave_num * vec_reg_size : 0 ) , " consistency check" );
608614}
609615
610616// Is vector's size (in bytes) bigger than a size saved by default?
@@ -2993,7 +2999,8 @@ void SharedRuntime::generate_deopt_blob() {
29932999 &first_frame_size_in_bytes,
29943000 /* generate_oop_map=*/ true ,
29953001 return_pc_adjustment_no_exception,
2996- RegisterSaver::return_pc_is_lr);
3002+ RegisterSaver::return_pc_is_lr,
3003+ /* save_vectors*/ SuperwordUseVSX);
29973004 assert (map != nullptr , " OopMap must have been created" );
29983005
29993006 __ li (exec_mode_reg, Deoptimization::Unpack_deopt);
@@ -3028,7 +3035,8 @@ void SharedRuntime::generate_deopt_blob() {
30283035 &first_frame_size_in_bytes,
30293036 /* generate_oop_map=*/ false ,
30303037 /* return_pc_adjustment_exception=*/ 0 ,
3031- RegisterSaver::return_pc_is_pre_saved);
3038+ RegisterSaver::return_pc_is_pre_saved,
3039+ /* save_vectors*/ SuperwordUseVSX);
30323040
30333041 // Deopt during an exception. Save exec mode for unpack_frames.
30343042 __ li (exec_mode_reg, Deoptimization::Unpack_exception);
@@ -3046,7 +3054,8 @@ void SharedRuntime::generate_deopt_blob() {
30463054 &first_frame_size_in_bytes,
30473055 /* generate_oop_map=*/ false ,
30483056 /* return_pc_adjustment_reexecute=*/ 0 ,
3049- RegisterSaver::return_pc_is_pre_saved);
3057+ RegisterSaver::return_pc_is_pre_saved,
3058+ /* save_vectors*/ SuperwordUseVSX);
30503059 __ li (exec_mode_reg, Deoptimization::Unpack_reexecute);
30513060#endif
30523061
@@ -3072,7 +3081,7 @@ void SharedRuntime::generate_deopt_blob() {
30723081
30733082 // Restore only the result registers that have been saved
30743083 // by save_volatile_registers(...).
3075- RegisterSaver::restore_result_registers (masm, first_frame_size_in_bytes);
3084+ RegisterSaver::restore_result_registers (masm, first_frame_size_in_bytes, /* save_vectors */ SuperwordUseVSX );
30763085
30773086 // reload the exec mode from the UnrollBlock (it might have changed)
30783087 __ lwz (exec_mode_reg, in_bytes (Deoptimization::UnrollBlock::unpack_kind_offset ()), unroll_block_reg);
0 commit comments