Skip to content

Commit 6e86904

Browse files
author
Andrew Haley
committed
8319973: AArch64: Save and restore FPCR in the call stub
Reviewed-by: adinn, stuefe
1 parent 04fd17e commit 6e86904

File tree

4 files changed

+34
-6
lines changed

4 files changed

+34
-6
lines changed

Diff for: src/hotspot/cpu/aarch64/assembler_aarch64.hpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -1088,8 +1088,8 @@ class Assembler : public AbstractAssembler {
10881088
#undef INSN
10891089

10901090
// we only provide mrs and msr for the special purpose system
1091-
// registers where op1 (instr[20:19]) == 11 and, (currently) only
1092-
// use it for FPSR n.b msr has L (instr[21]) == 0 mrs has L == 1
1091+
// registers where op1 (instr[20:19]) == 11
1092+
// n.b msr has L (instr[21]) == 0 mrs has L == 1
10931093

10941094
void msr(int op1, int CRn, int CRm, int op2, Register rt) {
10951095
starti;

Diff for: src/hotspot/cpu/aarch64/frame_aarch64.hpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@
9393
// Entry frames
9494
// n.b. these values are determined by the layout defined in
9595
// stubGenerator for the Java call stub
96-
entry_frame_after_call_words = 27,
96+
entry_frame_after_call_words = 29,
9797
entry_frame_call_wrapper_offset = -8,
9898

9999
// we don't need a save area

Diff for: src/hotspot/cpu/aarch64/macroAssembler_aarch64.hpp

+13
Original file line numberDiff line numberDiff line change
@@ -571,6 +571,19 @@ class MacroAssembler: public Assembler {
571571
msr(0b011, 0b0100, 0b0100, 0b001, zr);
572572
}
573573

574+
// FPCR : op1 == 011
575+
// CRn == 0100
576+
// CRm == 0100
577+
// op2 == 000
578+
579+
inline void get_fpcr(Register reg) {
580+
mrs(0b11, 0b0100, 0b0100, 0b000, reg);
581+
}
582+
583+
inline void set_fpcr(Register reg) {
584+
msr(0b011, 0b0100, 0b0100, 0b000, reg);
585+
}
586+
574587
// DCZID_EL0: op1 == 011
575588
// CRn == 0000
576589
// CRm == 0000

Diff for: src/hotspot/cpu/aarch64/stubGenerator_aarch64.cpp

+18-3
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,8 @@ class StubGenerator: public StubCodeGenerator {
141141
// [ return_from_Java ] <--- sp
142142
// [ argument word n ]
143143
// ...
144-
// -27 [ argument word 1 ]
144+
// -29 [ argument word 1 ]
145+
// -28 [ saved Floating-point Control Register ]
145146
// -26 [ saved v15 ] <--- sp_after_call
146147
// -25 [ saved v14 ]
147148
// -24 [ saved v13 ]
@@ -173,8 +174,9 @@ class StubGenerator: public StubCodeGenerator {
173174

174175
// Call stub stack layout word offsets from fp
175176
enum call_stub_layout {
176-
sp_after_call_off = -26,
177+
sp_after_call_off = -28,
177178

179+
fpcr_off = sp_after_call_off,
178180
d15_off = -26,
179181
d13_off = -24,
180182
d11_off = -22,
@@ -204,8 +206,9 @@ class StubGenerator: public StubCodeGenerator {
204206
StubCodeMark mark(this, "StubRoutines", "call_stub");
205207
address start = __ pc();
206208

207-
const Address sp_after_call(rfp, sp_after_call_off * wordSize);
209+
const Address sp_after_call (rfp, sp_after_call_off * wordSize);
208210

211+
const Address fpcr_save (rfp, fpcr_off * wordSize);
209212
const Address call_wrapper (rfp, call_wrapper_off * wordSize);
210213
const Address result (rfp, result_off * wordSize);
211214
const Address result_type (rfp, result_type_off * wordSize);
@@ -254,6 +257,14 @@ class StubGenerator: public StubCodeGenerator {
254257
__ stpd(v13, v12, d13_save);
255258
__ stpd(v15, v14, d15_save);
256259

260+
__ get_fpcr(rscratch1);
261+
__ str(rscratch1, fpcr_save);
262+
// Set FPCR to the state we need. We do want Round to Nearest. We
263+
// don't want non-IEEE rounding modes or floating-point traps.
264+
__ bfi(rscratch1, zr, 22, 4); // Clear DN, FZ, and Rmode
265+
__ bfi(rscratch1, zr, 8, 5); // Clear exception-control bits (8-12)
266+
__ set_fpcr(rscratch1);
267+
257268
// install Java thread in global register now we have saved
258269
// whatever value it held
259270
__ mov(rthread, c_rarg7);
@@ -367,6 +378,10 @@ class StubGenerator: public StubCodeGenerator {
367378
__ ldp(r22, r21, r22_save);
368379
__ ldp(r20, r19, r20_save);
369380

381+
// restore fpcr
382+
__ ldr(rscratch1, fpcr_save);
383+
__ set_fpcr(rscratch1);
384+
370385
__ ldp(c_rarg0, c_rarg1, call_wrapper);
371386
__ ldrw(c_rarg2, result_type);
372387
__ ldr(c_rarg3, method);

0 commit comments

Comments
 (0)