@@ -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