Skip to content

Commit 76a4610

Browse files
committed
Avoid redundant nv VR spill code in CRC stubs.
1 parent b3ae16e commit 76a4610

File tree

1 file changed

+20
-14
lines changed

1 file changed

+20
-14
lines changed

src/hotspot/cpu/ppc/macroAssembler_ppc.cpp

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3992,15 +3992,19 @@ void MacroAssembler::kernel_crc32_vpmsum_aligned(Register crc, Register buf, Reg
39923992
// Save non-volatile vector registers (frameless).
39933993
Register offset = t1;
39943994
int offsetInt = 0;
3995-
offsetInt -= 16; li(offset, offsetInt); stvx(VR20, offset, R1_SP);
3996-
offsetInt -= 16; li(offset, offsetInt); stvx(VR21, offset, R1_SP);
3997-
offsetInt -= 16; li(offset, offsetInt); stvx(VR22, offset, R1_SP);
3998-
offsetInt -= 16; li(offset, offsetInt); stvx(VR23, offset, R1_SP);
3999-
offsetInt -= 16; li(offset, offsetInt); stvx(VR24, offset, R1_SP);
4000-
offsetInt -= 16; li(offset, offsetInt); stvx(VR25, offset, R1_SP);
3995+
// C code treats VR20-31 as non-volatile. This code is called by interpreter, C1 and C2 which don't do that.
3996+
// We only need to save them here if we haven't done it earlier.
3997+
if (!SuperwordUseVSX) { // Otherwise, nv VRs already got saved when entering Java (call_stub etc.).
3998+
offsetInt -= 16; li(offset, offsetInt); stvx(VR20, offset, R1_SP);
3999+
offsetInt -= 16; li(offset, offsetInt); stvx(VR21, offset, R1_SP);
4000+
offsetInt -= 16; li(offset, offsetInt); stvx(VR22, offset, R1_SP);
4001+
offsetInt -= 16; li(offset, offsetInt); stvx(VR23, offset, R1_SP);
4002+
offsetInt -= 16; li(offset, offsetInt); stvx(VR24, offset, R1_SP);
4003+
offsetInt -= 16; li(offset, offsetInt); stvx(VR25, offset, R1_SP);
40014004
#ifndef VM_LITTLE_ENDIAN
4002-
offsetInt -= 16; li(offset, offsetInt); stvx(VR26, offset, R1_SP);
4005+
offsetInt -= 16; li(offset, offsetInt); stvx(VR26, offset, R1_SP);
40034006
#endif
4007+
}
40044008
offsetInt -= 8; std(R14, offsetInt, R1_SP);
40054009
offsetInt -= 8; std(R15, offsetInt, R1_SP);
40064010

@@ -4244,15 +4248,17 @@ void MacroAssembler::kernel_crc32_vpmsum_aligned(Register crc, Register buf, Reg
42444248

42454249
// Restore non-volatile Vector registers (frameless).
42464250
offsetInt = 0;
4247-
offsetInt -= 16; li(offset, offsetInt); lvx(VR20, offset, R1_SP);
4248-
offsetInt -= 16; li(offset, offsetInt); lvx(VR21, offset, R1_SP);
4249-
offsetInt -= 16; li(offset, offsetInt); lvx(VR22, offset, R1_SP);
4250-
offsetInt -= 16; li(offset, offsetInt); lvx(VR23, offset, R1_SP);
4251-
offsetInt -= 16; li(offset, offsetInt); lvx(VR24, offset, R1_SP);
4252-
offsetInt -= 16; li(offset, offsetInt); lvx(VR25, offset, R1_SP);
4251+
if (!SuperwordUseVSX) {
4252+
offsetInt -= 16; li(offset, offsetInt); lvx(VR20, offset, R1_SP);
4253+
offsetInt -= 16; li(offset, offsetInt); lvx(VR21, offset, R1_SP);
4254+
offsetInt -= 16; li(offset, offsetInt); lvx(VR22, offset, R1_SP);
4255+
offsetInt -= 16; li(offset, offsetInt); lvx(VR23, offset, R1_SP);
4256+
offsetInt -= 16; li(offset, offsetInt); lvx(VR24, offset, R1_SP);
4257+
offsetInt -= 16; li(offset, offsetInt); lvx(VR25, offset, R1_SP);
42534258
#ifndef VM_LITTLE_ENDIAN
4254-
offsetInt -= 16; li(offset, offsetInt); lvx(VR26, offset, R1_SP);
4259+
offsetInt -= 16; li(offset, offsetInt); lvx(VR26, offset, R1_SP);
42554260
#endif
4261+
}
42564262
offsetInt -= 8; ld(R14, offsetInt, R1_SP);
42574263
offsetInt -= 8; ld(R15, offsetInt, R1_SP);
42584264
}

0 commit comments

Comments
 (0)