Skip to content

Commit 384d2ea

Browse files
committed
8316125: Windows call_stub unnecessarily saves xmm16-31 when UseAVX>=3
Reviewed-by: jvernee, kvn, sviswanathan
1 parent 84390dd commit 384d2ea

File tree

3 files changed

+9
-26
lines changed

3 files changed

+9
-26
lines changed

src/hotspot/cpu/x86/frame_x86.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@
8282
// Entry frames
8383
#ifdef AMD64
8484
#ifdef _WIN64
85-
entry_frame_after_call_words = 60,
85+
entry_frame_after_call_words = 28,
8686
entry_frame_call_wrapper_offset = 2,
8787

8888
arg_reg_save_area_bytes = 32, // Register argument save area

src/hotspot/cpu/x86/stubGenerator_x86_64.cpp

Lines changed: 7 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -106,10 +106,8 @@
106106
// [ return_from_Java ] <--- rsp
107107
// [ argument word n ]
108108
// ...
109-
// -60 [ argument word 1 ]
110-
// -59 [ saved xmm31 ] <--- rsp after_call
111-
// [ saved xmm16-xmm30 ] (EVEX enabled, else the space is blank)
112-
// -27 [ saved xmm15 ]
109+
// -28 [ argument word 1 ]
110+
// -27 [ saved xmm15 ] <--- rsp after_call
113111
// [ saved xmm7-xmm14 ]
114112
// -9 [ saved xmm6 ] (each xmm register takes 2 slots)
115113
// -7 [ saved r15 ]
@@ -137,7 +135,7 @@
137135
#ifdef _WIN64
138136
enum call_stub_layout {
139137
xmm_save_first = 6, // save from xmm6
140-
xmm_save_last = 31, // to xmm31
138+
xmm_save_last = 15, // to xmm15
141139
xmm_save_base = -9,
142140
rsp_after_call_off = xmm_save_base - 2 * (xmm_save_last - xmm_save_first), // -27
143141
r15_off = -7,
@@ -237,17 +235,8 @@ address StubGenerator::generate_call_stub(address& return_address) {
237235

238236
#ifdef _WIN64
239237
int last_reg = 15;
240-
if (UseAVX > 2) {
241-
last_reg = 31;
242-
}
243-
if (VM_Version::supports_evex()) {
244-
for (int i = xmm_save_first; i <= last_reg; i++) {
245-
__ vextractf32x4(xmm_save(i), as_XMMRegister(i), 0);
246-
}
247-
} else {
248-
for (int i = xmm_save_first; i <= last_reg; i++) {
249-
__ movdqu(xmm_save(i), as_XMMRegister(i));
250-
}
238+
for (int i = xmm_save_first; i <= last_reg; i++) {
239+
__ movdqu(xmm_save(i), as_XMMRegister(i));
251240
}
252241

253242
const Address rdi_save(rbp, rdi_off * wordSize);
@@ -370,14 +359,8 @@ address StubGenerator::generate_call_stub(address& return_address) {
370359
// restore regs belonging to calling function
371360
#ifdef _WIN64
372361
// emit the restores for xmm regs
373-
if (VM_Version::supports_evex()) {
374-
for (int i = xmm_save_first; i <= last_reg; i++) {
375-
__ vinsertf32x4(as_XMMRegister(i), as_XMMRegister(i), xmm_save(i), 0);
376-
}
377-
} else {
378-
for (int i = xmm_save_first; i <= last_reg; i++) {
379-
__ movdqu(as_XMMRegister(i), xmm_save(i));
380-
}
362+
for (int i = xmm_save_first; i <= last_reg; i++) {
363+
__ movdqu(as_XMMRegister(i), xmm_save(i));
381364
}
382365
#endif
383366
__ movptr(r15, r15_save);

src/hotspot/cpu/x86/x86.ad

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ register %{
7171
//
7272
// Linux ABI: No register preserved across function calls
7373
// XMM0-XMM7 might hold parameters
74-
// Windows ABI: XMM6-XMM31 preserved across function calls
74+
// Windows ABI: XMM6-XMM15 preserved across function calls
7575
// XMM0-XMM3 might hold parameters
7676

7777
reg_def XMM0 ( SOC, SOC, Op_RegF, 0, xmm0->as_VMReg());

0 commit comments

Comments
 (0)