@@ -402,9 +402,7 @@ OopMap* RegisterSaver::save_live_registers(MacroAssembler* masm, RegisterSet reg
402402 break ;
403403 }
404404
405- // Second set_callee_saved is really a waste but we'll keep things as they were for now
406405 map->set_callee_saved (VMRegImpl::stack2reg (offset >> 2 ), live_regs[i].vmreg );
407- map->set_callee_saved (VMRegImpl::stack2reg ((offset + half_reg_size) >> 2 ), live_regs[i].vmreg ->next ());
408406 }
409407 assert (first != noreg, " Should spill at least one int reg." );
410408 __ z_stmg (first, last, first_offset, Z_SP);
@@ -473,7 +471,6 @@ OopMap* RegisterSaver::generate_oop_map(MacroAssembler* masm, RegisterSet reg_se
473471 for (int i = 0 ; i < regstosave_num; i++) {
474472 if (live_regs[i].reg_type < RegisterSaver::excluded_reg) {
475473 map->set_callee_saved (VMRegImpl::stack2reg (offset>>2 ), live_regs[i].vmreg );
476- map->set_callee_saved (VMRegImpl::stack2reg ((offset + half_reg_size)>>2 ), live_regs[i].vmreg ->next ());
477474 }
478475 offset += reg_size;
479476 }
@@ -580,10 +577,12 @@ void RegisterSaver::restore_live_registers(MacroAssembler* masm, RegisterSet reg
580577
581578
582579// Pop the current frame and restore the registers that might be holding a result.
583- void RegisterSaver::restore_result_registers (MacroAssembler* masm) {
580+ void RegisterSaver::restore_result_registers (MacroAssembler* masm, bool save_vectors ) {
584581 const int regstosave_num = sizeof (RegisterSaver_LiveRegs) /
585582 sizeof (RegisterSaver::LiveRegType);
586- const int register_save_offset = live_reg_frame_size (all_registers) - live_reg_save_size (all_registers);
583+ const int vecregstosave_num = save_vectors ? calculate_vregstosave_num () : 0 ;
584+ const int vreg_save_size = vecregstosave_num * v_reg_size;
585+ const int register_save_offset = live_reg_frame_size (all_registers, save_vectors) - (live_reg_save_size (all_registers) + vreg_save_size);
587586
588587 // Restore all result registers (ints and floats).
589588 int offset = register_save_offset;
@@ -609,7 +608,7 @@ void RegisterSaver::restore_result_registers(MacroAssembler* masm) {
609608 ShouldNotReachHere ();
610609 }
611610 }
612- assert (offset == live_reg_frame_size (all_registers) , " consistency check" );
611+ assert (offset == live_reg_frame_size (all_registers, save_vectors) - (save_vectors ? vreg_save_size : 0 ) , " consistency check" );
613612}
614613
615614// ---------------------------------------------------------------------------
@@ -2557,7 +2556,7 @@ void SharedRuntime::generate_deopt_blob() {
25572556 // nmethod that was valid just before the nmethod was deoptimized.
25582557 // save R14 into the deoptee frame. the `fetch_unroll_info'
25592558 // procedure called below will read it from there.
2560- map = RegisterSaver::save_live_registers (masm, RegisterSaver::all_registers);
2559+ map = RegisterSaver::save_live_registers (masm, RegisterSaver::all_registers, Z_R14, /* save_vectors= */ SuperwordUseVX );
25612560
25622561 // note the entry point.
25632562 __ load_const_optimized (exec_mode_reg, Deoptimization::Unpack_deopt);
@@ -2573,7 +2572,7 @@ void SharedRuntime::generate_deopt_blob() {
25732572 int reexecute_offset = __ offset () - start_off;
25742573
25752574 // No need to update map as each call to save_live_registers will produce identical oopmap
2576- (void ) RegisterSaver::save_live_registers (masm, RegisterSaver::all_registers);
2575+ (void ) RegisterSaver::save_live_registers (masm, RegisterSaver::all_registers, Z_R14, /* save_vectors= */ SuperwordUseVX );
25772576
25782577 __ load_const_optimized (exec_mode_reg, Deoptimization::Unpack_reexecute);
25792578 __ z_bru (exec_mode_initialized);
@@ -2611,7 +2610,7 @@ void SharedRuntime::generate_deopt_blob() {
26112610 __ z_lg (Z_R1_scratch, Address (Z_thread, JavaThread::exception_pc_offset ()));
26122611
26132612 // Save everything in sight.
2614- (void ) RegisterSaver::save_live_registers (masm, RegisterSaver::all_registers, Z_R1_scratch);
2613+ (void ) RegisterSaver::save_live_registers (masm, RegisterSaver::all_registers, Z_R1_scratch, /* save_vectors= */ SuperwordUseVX );
26152614
26162615 // Now it is safe to overwrite any register
26172616
@@ -2661,7 +2660,7 @@ void SharedRuntime::generate_deopt_blob() {
26612660 __ z_lgr (unroll_block_reg, Z_RET);
26622661 // restore the return registers that have been saved
26632662 // (among other registers) by save_live_registers(...).
2664- RegisterSaver::restore_result_registers (masm);
2663+ RegisterSaver::restore_result_registers (masm, /* save_vectors */ SuperwordUseVX );
26652664
26662665 // reload the exec mode from the UnrollBlock (it might have changed)
26672666 __ z_llgf (exec_mode_reg, Address (unroll_block_reg, Deoptimization::UnrollBlock::unpack_kind_offset ()));
@@ -2737,7 +2736,7 @@ void SharedRuntime::generate_deopt_blob() {
27372736 // Make sure all code is generated
27382737 masm->flush ();
27392738
2740- _deopt_blob = DeoptimizationBlob::create (&buffer, oop_maps, 0 , exception_offset, reexecute_offset, RegisterSaver::live_reg_frame_size (RegisterSaver::all_registers)/wordSize);
2739+ _deopt_blob = DeoptimizationBlob::create (&buffer, oop_maps, 0 , exception_offset, reexecute_offset, RegisterSaver::live_reg_frame_size (RegisterSaver::all_registers, SuperwordUseVX )/wordSize);
27412740 _deopt_blob->set_unpack_with_exception_in_tls_offset (exception_in_tls_offset);
27422741}
27432742
0 commit comments