Skip to content

Commit 05594c0

Browse files
committed
Use vector pair instructions on Power10.
1 parent 89a1e9d commit 05594c0

File tree

3 files changed

+39
-20
lines changed

3 files changed

+39
-20
lines changed

src/hotspot/cpu/ppc/assembler_ppc.hpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -538,6 +538,8 @@ class Assembler : public AbstractAssembler {
538538
LXVL_OPCODE = (31u << OPCODE_SHIFT | 269u << 1),
539539
STXV_OPCODE = (61u << OPCODE_SHIFT | 5u ),
540540
STXVL_OPCODE = (31u << OPCODE_SHIFT | 397u << 1),
541+
LXVP_OPCODE = ( 6u << OPCODE_SHIFT ),
542+
STXVP_OPCODE = ( 6u << OPCODE_SHIFT | 1u ),
541543
LXVD2X_OPCODE = (31u << OPCODE_SHIFT | 844u << 1),
542544
STXVD2X_OPCODE = (31u << OPCODE_SHIFT | 972u << 1),
543545
MTVSRD_OPCODE = (31u << OPCODE_SHIFT | 179u << 1),
@@ -1243,6 +1245,11 @@ class Assembler : public AbstractAssembler {
12431245
static int vsdm( int x) { return opp_u_field(x, 23, 22); }
12441246
static int vsrs_dq( int x) { return opp_u_field(x & 0x1F, 10, 6) | opp_u_field((x & 0x20) >> 5, 28, 28); }
12451247
static int vsrt_dq( int x) { return vsrs_dq(x); }
1248+
static int vsrtp( int x) {
1249+
assert((x & 1) == 0, "must be even");
1250+
return opp_u_field((x & 0x1F) >> 1, 9, 6) | opp_u_field((x & 0x20) >> 5, 10, 10);
1251+
}
1252+
static int vsrsp( int x) { return vsrtp(x); }
12461253

12471254
static int vsra( VectorSRegister r) { return vsra(r->encoding());}
12481255
static int vsrb( VectorSRegister r) { return vsrb(r->encoding());}
@@ -1251,6 +1258,8 @@ class Assembler : public AbstractAssembler {
12511258
static int vsrt( VectorSRegister r) { return vsrt(r->encoding());}
12521259
static int vsrs_dq(VectorSRegister r) { return vsrs_dq(r->encoding());}
12531260
static int vsrt_dq(VectorSRegister r) { return vsrt_dq(r->encoding());}
1261+
static int vsrtp( VectorSRegister r) { return vsrtp(r->encoding());}
1262+
static int vsrsp( VectorSRegister r) { return vsrsp(r->encoding());}
12541263

12551264
static int vsplt_uim( int x) { return opp_u_field(x, 15, 12); } // for vsplt* instructions
12561265
static int vsplti_sim(int x) { return opp_u_field(x, 15, 11); } // for vsplti* instructions
@@ -2358,6 +2367,8 @@ class Assembler : public AbstractAssembler {
23582367
// Vector-Scalar (VSX) instructions.
23592368
inline void lxv( VectorSRegister d, int si16, Register a);
23602369
inline void stxv( VectorSRegister d, int si16, Register a);
2370+
inline void lxvp( VectorSRegister d, int si16, Register a);
2371+
inline void stxvp( VectorSRegister d, int si16, Register a);
23612372
inline void lxvl( VectorSRegister d, Register a, Register b);
23622373
inline void stxvl( VectorSRegister d, Register a, Register b);
23632374
inline void lxvd2x( VectorSRegister d, Register a);

src/hotspot/cpu/ppc/assembler_ppc.inline.hpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -862,8 +862,10 @@ inline void Assembler::lvsl( VectorRegister d, Register s1, Register s2) { emit
862862
inline void Assembler::lvsr( VectorRegister d, Register s1, Register s2) { emit_int32( LVSR_OPCODE | vrt(d) | ra0mem(s1) | rb(s2)); }
863863

864864
// Vector-Scalar (VSX) instructions.
865-
inline void Assembler::lxv( VectorSRegister d, int ui16, Register a) { assert(is_aligned(ui16, 16), "displacement must be a multiple of 16"); emit_int32( LXV_OPCODE | vsrt_dq(d) | ra0mem(a) | uimm(ui16, 16)); }
866-
inline void Assembler::stxv( VectorSRegister d, int ui16, Register a) { assert(is_aligned(ui16, 16), "displacement must be a multiple of 16"); emit_int32( STXV_OPCODE | vsrs_dq(d) | ra0mem(a) | uimm(ui16, 16)); }
865+
inline void Assembler::lxv( VectorSRegister d, int si16, Register a) { assert(is_aligned(si16, 16), "displacement must be a multiple of 16"); emit_int32( LXV_OPCODE | vsrt_dq(d) | ra0mem(a) | simm(si16, 16)); }
866+
inline void Assembler::stxv( VectorSRegister d, int si16, Register a) { assert(is_aligned(si16, 16), "displacement must be a multiple of 16"); emit_int32( STXV_OPCODE | vsrs_dq(d) | ra0mem(a) | simm(si16, 16)); }
867+
inline void Assembler::lxvp( VectorSRegister d, int si16, Register a) { assert(is_aligned(si16, 16), "displacement must be a multiple of 16"); emit_int32( LXVP_OPCODE | vsrtp(d) | ra0mem(a) | simm(si16, 16)); }
868+
inline void Assembler::stxvp( VectorSRegister d, int si16, Register a) { assert(is_aligned(si16, 16), "displacement must be a multiple of 16"); emit_int32( STXVP_OPCODE | vsrsp(d) | ra0mem(a) | simm(si16, 16)); }
867869
inline void Assembler::lxvl( VectorSRegister d, Register s1, Register b) { emit_int32( LXVL_OPCODE | vsrt(d) | ra0mem(s1) | rb(b)); }
868870
inline void Assembler::stxvl( VectorSRegister d, Register s1, Register b) { emit_int32( STXVL_OPCODE | vsrt(d) | ra0mem(s1) | rb(b)); }
869871
inline void Assembler::lxvd2x( VectorSRegister d, Register s1) { emit_int32( LXVD2X_OPCODE | vsrt(d) | ra(0) | rb(s1)); }

src/hotspot/cpu/ppc/macroAssembler_ppc.cpp

Lines changed: 24 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -774,10 +774,6 @@ void MacroAssembler::clobber_carg_stack_slots(Register tmp) {
774774
}
775775
}
776776

777-
// Uses ordering which corresponds to ABI:
778-
// _savegpr0_14: std r14,-144(r1)
779-
// _savegpr0_15: std r15,-136(r1)
780-
// _savegpr0_16: std r16,-128(r1)
781777
void MacroAssembler::save_nonvolatile_registers(Register dst, int offset, bool include_fp_regs, bool include_vector_regs) {
782778
for (int i = 14; i < 32; i++) {
783779
std(as_Register(i), offset, dst);
@@ -793,19 +789,22 @@ void MacroAssembler::save_nonvolatile_registers(Register dst, int offset, bool i
793789

794790
if (include_vector_regs) {
795791
assert(is_aligned(offset, StackAlignmentInBytes), "should be");
796-
Register spill_addr = R0;
797-
for (int i = 20; i < 32; i++) {
798-
addi(spill_addr, dst, offset);
799-
stxvd2x(as_VectorRegister(i)->to_vsr(), spill_addr);
800-
offset += 16;
792+
if (PowerArchitecturePPC64 >= 10) {
793+
for (int i = 20; i < 32; i += 2) {
794+
stxvp(as_VectorRegister(i)->to_vsr(), offset, dst);
795+
offset += 32;
796+
}
797+
} else {
798+
Register spill_addr = R0;
799+
for (int i = 20; i < 32; i++) {
800+
addi(spill_addr, dst, offset);
801+
stxvd2x(as_VectorRegister(i)->to_vsr(), spill_addr);
802+
offset += 16;
803+
}
801804
}
802805
}
803806
}
804807

805-
// Uses ordering which corresponds to ABI:
806-
// _restgpr0_14: ld r14,-144(r1)
807-
// _restgpr0_15: ld r15,-136(r1)
808-
// _restgpr0_16: ld r16,-128(r1)
809808
void MacroAssembler::restore_nonvolatile_registers(Register src, int offset, bool include_fp_regs, bool include_vector_regs) {
810809
for (int i = 14; i < 32; i++) {
811810
ld(as_Register(i), offset, src);
@@ -821,11 +820,18 @@ void MacroAssembler::restore_nonvolatile_registers(Register src, int offset, boo
821820

822821
if (include_vector_regs) {
823822
assert(is_aligned(offset, StackAlignmentInBytes), "should be");
824-
Register spill_addr = R0;
825-
for (int i = 20; i < 32; i++) {
826-
addi(spill_addr, src, offset);
827-
lxvd2x(as_VectorRegister(i)->to_vsr(), spill_addr);
828-
offset += 16;
823+
if (PowerArchitecturePPC64 >= 10) {
824+
for (int i = 20; i < 32; i += 2) {
825+
lxvp(as_VectorRegister(i)->to_vsr(), offset, src);
826+
offset += 32;
827+
}
828+
} else {
829+
Register spill_addr = R0;
830+
for (int i = 20; i < 32; i++) {
831+
addi(spill_addr, src, offset);
832+
lxvd2x(as_VectorRegister(i)->to_vsr(), spill_addr);
833+
offset += 16;
834+
}
829835
}
830836
}
831837
}

0 commit comments

Comments
 (0)