@@ -354,18 +354,34 @@ OopMap* RegisterSaver::push_frame_reg_args_and_save_live_registers(MacroAssemble
354354 offset += reg_size;
355355 }
356356
357- for (int i = 0 ; i < vsregstosave_num; i++) {
358- int reg_num = RegisterSaver_LiveVSRegs[i].reg_num ;
359- int reg_type = RegisterSaver_LiveVSRegs[i].reg_type ;
357+ if (PowerArchitecturePPC64 >= 10 ) {
358+ for (int i = 0 ; i < vsregstosave_num; i += 2 ) {
359+ int reg_num = RegisterSaver_LiveVSRegs[i].reg_num ;
360+ assert (RegisterSaver_LiveVSRegs[i + 1 ].reg_num == reg_num + 1 , " or use other instructions!" );
361+
362+ __ stxvp (as_VectorSRegister (reg_num), offset, R1_SP);
363+
364+ if (generate_oop_map) {
365+ map->set_callee_saved (VMRegImpl::stack2reg (offset >> 2 ),
366+ RegisterSaver_LiveVSRegs[i].vmreg );
367+ map->set_callee_saved (VMRegImpl::stack2reg ((offset + vs_reg_size) >> 2 ),
368+ RegisterSaver_LiveVSRegs[i + 1 ].vmreg );
369+ }
370+ offset += (2 * vs_reg_size);
371+ }
372+ } else {
373+ for (int i = 0 ; i < vsregstosave_num; i++) {
374+ int reg_num = RegisterSaver_LiveVSRegs[i].reg_num ;
360375
361- __ li (R30 , offset);
362- __ stxvd2x (as_VectorSRegister (reg_num), R30 , R1_SP);
376+ __ li (R31 , offset);
377+ __ stxvd2x (as_VectorSRegister (reg_num), R31 , R1_SP);
363378
364- if (generate_oop_map) {
365- map->set_callee_saved (VMRegImpl::stack2reg (offset>>2 ),
366- RegisterSaver_LiveVSRegs[i].vmreg );
379+ if (generate_oop_map) {
380+ map->set_callee_saved (VMRegImpl::stack2reg (offset >> 2 ),
381+ RegisterSaver_LiveVSRegs[i].vmreg );
382+ }
383+ offset += vs_reg_size;
367384 }
368- offset += vs_reg_size;
369385 }
370386
371387 assert (offset == frame_size_in_bytes, " consistency check" );
@@ -428,14 +444,24 @@ void RegisterSaver::restore_live_registers_and_pop_frame(MacroAssembler* masm,
428444 offset += reg_size;
429445 }
430446
431- for (int i = 0 ; i < vsregstosave_num; i++) {
432- int reg_num = RegisterSaver_LiveVSRegs[i].reg_num ;
433- int reg_type = RegisterSaver_LiveVSRegs[i].reg_type ;
447+ if (PowerArchitecturePPC64 >= 10 ) {
448+ for (int i = 0 ; i < vsregstosave_num; i += 2 ) {
449+ int reg_num = RegisterSaver_LiveVSRegs[i].reg_num ;
450+ assert (RegisterSaver_LiveVSRegs[i + 1 ].reg_num == reg_num + 1 , " or use other instructions!" );
434451
435- __ li (R31, offset);
436- __ lxvd2x (as_VectorSRegister (reg_num), R31, R1_SP);
452+ __ lxvp (as_VectorSRegister (reg_num), offset, R1_SP);
437453
438- offset += vs_reg_size;
454+ offset += (2 * vs_reg_size);
455+ }
456+ } else {
457+ for (int i = 0 ; i < vsregstosave_num; i++) {
458+ int reg_num = RegisterSaver_LiveVSRegs[i].reg_num ;
459+
460+ __ li (R31, offset);
461+ __ lxvd2x (as_VectorSRegister (reg_num), R31, R1_SP);
462+
463+ offset += vs_reg_size;
464+ }
439465 }
440466
441467 assert (offset == frame_size_in_bytes, " consistency check" );
0 commit comments