mirror of
https://github.com/openjdk/jdk.git
synced 2026-01-28 12:09:14 +00:00
8316125: Windows call_stub unnecessarily saves xmm16-31 when UseAVX>=3
Reviewed-by: jvernee, kvn, sviswanathan
This commit is contained in:
parent
84390dd063
commit
384d2ea6d1
@ -82,7 +82,7 @@
|
||||
// Entry frames
|
||||
#ifdef AMD64
|
||||
#ifdef _WIN64
|
||||
entry_frame_after_call_words = 60,
|
||||
entry_frame_after_call_words = 28,
|
||||
entry_frame_call_wrapper_offset = 2,
|
||||
|
||||
arg_reg_save_area_bytes = 32, // Register argument save area
|
||||
|
||||
@ -106,10 +106,8 @@
|
||||
// [ return_from_Java ] <--- rsp
|
||||
// [ argument word n ]
|
||||
// ...
|
||||
// -60 [ argument word 1 ]
|
||||
// -59 [ saved xmm31 ] <--- rsp after_call
|
||||
// [ saved xmm16-xmm30 ] (EVEX enabled, else the space is blank)
|
||||
// -27 [ saved xmm15 ]
|
||||
// -28 [ argument word 1 ]
|
||||
// -27 [ saved xmm15 ] <--- rsp after_call
|
||||
// [ saved xmm7-xmm14 ]
|
||||
// -9 [ saved xmm6 ] (each xmm register takes 2 slots)
|
||||
// -7 [ saved r15 ]
|
||||
@ -137,7 +135,7 @@
|
||||
#ifdef _WIN64
|
||||
enum call_stub_layout {
|
||||
xmm_save_first = 6, // save from xmm6
|
||||
xmm_save_last = 31, // to xmm31
|
||||
xmm_save_last = 15, // to xmm15
|
||||
xmm_save_base = -9,
|
||||
rsp_after_call_off = xmm_save_base - 2 * (xmm_save_last - xmm_save_first), // -27
|
||||
r15_off = -7,
|
||||
@ -237,17 +235,8 @@ address StubGenerator::generate_call_stub(address& return_address) {
|
||||
|
||||
#ifdef _WIN64
|
||||
int last_reg = 15;
|
||||
if (UseAVX > 2) {
|
||||
last_reg = 31;
|
||||
}
|
||||
if (VM_Version::supports_evex()) {
|
||||
for (int i = xmm_save_first; i <= last_reg; i++) {
|
||||
__ vextractf32x4(xmm_save(i), as_XMMRegister(i), 0);
|
||||
}
|
||||
} else {
|
||||
for (int i = xmm_save_first; i <= last_reg; i++) {
|
||||
__ movdqu(xmm_save(i), as_XMMRegister(i));
|
||||
}
|
||||
for (int i = xmm_save_first; i <= last_reg; i++) {
|
||||
__ movdqu(xmm_save(i), as_XMMRegister(i));
|
||||
}
|
||||
|
||||
const Address rdi_save(rbp, rdi_off * wordSize);
|
||||
@ -370,14 +359,8 @@ address StubGenerator::generate_call_stub(address& return_address) {
|
||||
// restore regs belonging to calling function
|
||||
#ifdef _WIN64
|
||||
// emit the restores for xmm regs
|
||||
if (VM_Version::supports_evex()) {
|
||||
for (int i = xmm_save_first; i <= last_reg; i++) {
|
||||
__ vinsertf32x4(as_XMMRegister(i), as_XMMRegister(i), xmm_save(i), 0);
|
||||
}
|
||||
} else {
|
||||
for (int i = xmm_save_first; i <= last_reg; i++) {
|
||||
__ movdqu(as_XMMRegister(i), xmm_save(i));
|
||||
}
|
||||
for (int i = xmm_save_first; i <= last_reg; i++) {
|
||||
__ movdqu(as_XMMRegister(i), xmm_save(i));
|
||||
}
|
||||
#endif
|
||||
__ movptr(r15, r15_save);
|
||||
|
||||
@ -71,7 +71,7 @@ register %{
|
||||
//
|
||||
// Linux ABI: No register preserved across function calls
|
||||
// XMM0-XMM7 might hold parameters
|
||||
// Windows ABI: XMM6-XMM31 preserved across function calls
|
||||
// Windows ABI: XMM6-XMM15 preserved across function calls
|
||||
// XMM0-XMM3 might hold parameters
|
||||
|
||||
reg_def XMM0 ( SOC, SOC, Op_RegF, 0, xmm0->as_VMReg());
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user