Skip to content
This repository was archived by the owner on Feb 2, 2023. It is now read-only.
/ jdk13u-dev Public archive

Commit d46f297

Browse files
Sergey NazarkinYuri Nesterenko
Sergey Nazarkin
authored and
Yuri Nesterenko
committed
8231118: ARM32: Math tests failures
Backport-of: 485115d
1 parent 8d96cc3 commit d46f297

6 files changed

+40
-27
lines changed

src/hotspot/cpu/arm/assembler_arm_32.hpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -963,8 +963,8 @@ class Assembler : public AbstractAssembler {
963963

964964
F(fldmia, 1, 1) F(fldmfd, 1, 1)
965965
F(fldmdb, 1, 2) F(fldmea, 1, 2)
966-
F(fstmia, 0, 1) F(fstmfd, 0, 1)
967-
F(fstmdb, 0, 2) F(fstmea, 0, 2)
966+
F(fstmia, 0, 1) F(fstmea, 0, 1)
967+
F(fstmdb, 0, 2) F(fstmfd, 0, 2)
968968
#undef F
969969

970970
// fconst{s,d} encoding:

src/hotspot/cpu/arm/c1_Runtime1_arm.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,7 @@ static OopMap* save_live_registers(StubAssembler* sasm, bool save_fpu_registers
189189
__ push(RegisterSet(FP) | RegisterSet(LR));
190190
__ push(RegisterSet(R0, R6) | RegisterSet(R8, R10) | R12 | altFP_7_11);
191191
if (save_fpu_registers) {
192-
__ fstmdbd(SP, FloatRegisterSet(D0, fpu_save_size / 2), writeback);
192+
__ fpush(FloatRegisterSet(D0, fpu_save_size / 2));
193193
} else {
194194
__ sub(SP, SP, fpu_save_size * wordSize);
195195
}
@@ -206,7 +206,7 @@ static void restore_live_registers(StubAssembler* sasm,
206206
__ block_comment("restore_live_registers");
207207

208208
if (restore_fpu_registers) {
209-
__ fldmiad(SP, FloatRegisterSet(D0, fpu_save_size / 2), writeback);
209+
__ fpop(FloatRegisterSet(D0, fpu_save_size / 2));
210210
if (!restore_R0) {
211211
__ add(SP, SP, (R1_offset - fpu_save_size) * wordSize);
212212
}

src/hotspot/cpu/arm/macroAssembler_arm.hpp

+20
Original file line numberDiff line numberDiff line change
@@ -435,6 +435,26 @@ class MacroAssembler: public Assembler {
435435
fldmias(SP, FloatRegisterSet(fd), writeback, cond);
436436
}
437437

438+
void fpush(FloatRegisterSet reg_set) {
439+
fstmdbd(SP, reg_set, writeback);
440+
}
441+
442+
void fpop(FloatRegisterSet reg_set) {
443+
fldmiad(SP, reg_set, writeback);
444+
}
445+
446+
void fpush_hardfp(FloatRegisterSet reg_set) {
447+
#ifndef __SOFTFP__
448+
fpush(reg_set);
449+
#endif
450+
}
451+
452+
void fpop_hardfp(FloatRegisterSet reg_set) {
453+
#ifndef __SOFTFP__
454+
fpop(reg_set);
455+
#endif
456+
}
457+
438458
// Order access primitives
439459
enum Membar_mask_bits {
440460
StoreStore = 1 << 3,

src/hotspot/cpu/arm/sharedRuntime_arm.cpp

+8-11
Original file line numberDiff line numberDiff line change
@@ -132,14 +132,14 @@ OopMap* RegisterSaver::save_live_registers(MacroAssembler* masm,
132132
__ push(SAVED_BASE_REGS);
133133
if (HaveVFP) {
134134
if (VM_Version::has_vfp3_32()) {
135-
__ fstmdbd(SP, FloatRegisterSet(D16, 16), writeback);
135+
__ fpush(FloatRegisterSet(D16, 16));
136136
} else {
137137
if (FloatRegisterImpl::number_of_registers > 32) {
138138
assert(FloatRegisterImpl::number_of_registers == 64, "nb fp registers should be 64");
139139
__ sub(SP, SP, 32 * wordSize);
140140
}
141141
}
142-
__ fstmdbd(SP, FloatRegisterSet(D0, 16), writeback);
142+
__ fpush(FloatRegisterSet(D0, 16));
143143
} else {
144144
__ sub(SP, SP, fpu_save_size * wordSize);
145145
}
@@ -173,9 +173,9 @@ OopMap* RegisterSaver::save_live_registers(MacroAssembler* masm,
173173

174174
void RegisterSaver::restore_live_registers(MacroAssembler* masm, bool restore_lr) {
175175
if (HaveVFP) {
176-
__ fldmiad(SP, FloatRegisterSet(D0, 16), writeback);
176+
__ fpop(FloatRegisterSet(D0, 16));
177177
if (VM_Version::has_vfp3_32()) {
178-
__ fldmiad(SP, FloatRegisterSet(D16, 16), writeback);
178+
__ fpop(FloatRegisterSet(D16, 16));
179179
} else {
180180
if (FloatRegisterImpl::number_of_registers > 32) {
181181
assert(FloatRegisterImpl::number_of_registers == 64, "nb fp registers should be 64");
@@ -220,26 +220,21 @@ static void push_param_registers(MacroAssembler* masm, int fp_regs_in_arguments)
220220
// R1-R3 arguments need to be saved, but we push 4 registers for 8-byte alignment
221221
__ push(RegisterSet(R0, R3));
222222

223-
#ifdef __ABI_HARD__
224223
// preserve arguments
225224
// Likely not needed as the locking code won't probably modify volatile FP registers,
226225
// but there is no way to guarantee that
227226
if (fp_regs_in_arguments) {
228227
// convert fp_regs_in_arguments to a number of double registers
229228
int double_regs_num = (fp_regs_in_arguments + 1) >> 1;
230-
__ fstmdbd(SP, FloatRegisterSet(D0, double_regs_num), writeback);
229+
__ fpush_hardfp(FloatRegisterSet(D0, double_regs_num));
231230
}
232-
#endif // __ ABI_HARD__
233231
}
234232

235233
static void pop_param_registers(MacroAssembler* masm, int fp_regs_in_arguments) {
236-
#ifdef __ABI_HARD__
237234
if (fp_regs_in_arguments) {
238235
int double_regs_num = (fp_regs_in_arguments + 1) >> 1;
239-
__ fldmiad(SP, FloatRegisterSet(D0, double_regs_num), writeback);
236+
__ fpop_hardfp(FloatRegisterSet(D0, double_regs_num));
240237
}
241-
#endif // __ABI_HARD__
242-
243238
__ pop(RegisterSet(R0, R3));
244239
}
245240

@@ -461,11 +456,13 @@ static void patch_callers_callsite(MacroAssembler *masm) {
461456
// Pushing an even number of registers for stack alignment.
462457
// Selecting R9, which had to be saved anyway for some platforms.
463458
__ push(RegisterSet(R0, R3) | R9 | LR);
459+
__ fpush_hardfp(FloatRegisterSet(D0, 8));
464460

465461
__ mov(R0, Rmethod);
466462
__ mov(R1, LR);
467463
__ call(CAST_FROM_FN_PTR(address, SharedRuntime::fixup_callers_callsite));
468464

465+
__ fpop_hardfp(FloatRegisterSet(D0, 8));
469466
__ pop(RegisterSet(R0, R3) | R9 | LR);
470467

471468
__ bind(skip);

src/hotspot/cpu/arm/stubGenerator_arm.cpp

+2-6
Original file line numberDiff line numberDiff line change
@@ -179,9 +179,7 @@ class StubGenerator: public StubCodeGenerator {
179179

180180
__ mov(Rtemp, SP);
181181
__ push(RegisterSet(FP) | RegisterSet(LR));
182-
#ifndef __SOFTFP__
183-
__ fstmdbd(SP, FloatRegisterSet(D8, 8), writeback);
184-
#endif
182+
__ fpush_hardfp(FloatRegisterSet(D8, 8));
185183
__ stmdb(SP, RegisterSet(R0, R2) | RegisterSet(R4, R6) | RegisterSet(R8, R10) | altFP_7_11, writeback);
186184
__ mov(Rmethod, R3);
187185
__ ldmia(Rtemp, RegisterSet(R1, R3) | Rthread); // stacked arguments
@@ -243,9 +241,7 @@ class StubGenerator: public StubCodeGenerator {
243241
#endif
244242

245243
__ pop(RegisterSet(R4, R6) | RegisterSet(R8, R10) | altFP_7_11);
246-
#ifndef __SOFTFP__
247-
__ fldmiad(SP, FloatRegisterSet(D8, 8), writeback);
248-
#endif
244+
__ fpop_hardfp(FloatRegisterSet(D8, 8));
249245
__ pop(RegisterSet(FP) | RegisterSet(PC));
250246

251247
return start;

src/hotspot/cpu/arm/stubRoutinesCrypto_arm.cpp

+6-6
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ address generate_aescrypt_encryptBlock() {
129129
// Register tbox = R3; // transposition box reference
130130

131131
__ push (RegisterSet(R4, R12) | LR);
132-
__ fstmdbd(SP, FloatRegisterSet(D0, 4), writeback);
132+
__ fpush(FloatRegisterSet(D0, 4));
133133
__ sub(SP, SP, 32);
134134

135135
// preserve TBox references
@@ -308,7 +308,7 @@ address generate_aescrypt_encryptBlock() {
308308
__ str(R0, Address(R9));
309309

310310
__ add(SP, SP, 32);
311-
__ fldmiad(SP, FloatRegisterSet(D0, 4), writeback);;
311+
__ fpop(FloatRegisterSet(D0, 4));
312312

313313
__ pop(RegisterSet(R4, R12) | PC);
314314
return start;
@@ -326,7 +326,7 @@ address generate_aescrypt_decryptBlock() {
326326
// Register tbox = R3; // transposition box reference
327327

328328
__ push (RegisterSet(R4, R12) | LR);
329-
__ fstmdbd(SP, FloatRegisterSet(D0, 4), writeback);
329+
__ fpush(FloatRegisterSet(D0, 4));
330330
__ sub(SP, SP, 32);
331331

332332
// retrieve key length
@@ -521,7 +521,7 @@ address generate_aescrypt_decryptBlock() {
521521
__ str(R0, Address(R9));
522522

523523
__ add(SP, SP, 32);
524-
__ fldmiad(SP, FloatRegisterSet(D0, 4), writeback);;
524+
__ fpop(FloatRegisterSet(D0, 4));
525525
__ pop(RegisterSet(R4, R12) | PC);
526526

527527
return start;
@@ -680,7 +680,7 @@ address generate_cipherBlockChaining_decryptAESCrypt() {
680680
Label decrypt_8_blocks;
681681
int quad = 1;
682682
// Process 8 blocks in parallel
683-
__ fstmdbd(SP, FloatRegisterSet(D8, 8), writeback);
683+
__ fpush(FloatRegisterSet(D8, 8));
684684
__ sub(SP, SP, 40);
685685

686686
// record output buffer end address (used as a block counter)
@@ -1020,7 +1020,7 @@ address generate_cipherBlockChaining_decryptAESCrypt() {
10201020
__ b(decrypt_8_blocks, ne);
10211021

10221022
__ add(SP, SP, 40);
1023-
__ fldmiad(SP, FloatRegisterSet(D8, 8), writeback);;
1023+
__ fpop(FloatRegisterSet(D8, 8));
10241024
}
10251025

10261026
__ bind(cbc_done);

0 commit comments

Comments
 (0)