Skip to content

Commit f79e9d4

Browse files
author
Vladimir Ivanov
committed
8256061: RegisterSaver::save_live_registers() omits upper halves of ZMM0-15 registers
Reviewed-by: kvn
1 parent 503590f commit f79e9d4

File tree

1 file changed

+23
-9
lines changed

1 file changed

+23
-9
lines changed

src/hotspot/cpu/x86/sharedRuntime_x86_64.cpp

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -89,9 +89,10 @@ class RegisterSaver {
8989
#define XSAVE_AREA_YMM_BEGIN 576
9090
#define XSAVE_AREA_ZMM_BEGIN 1152
9191
#define XSAVE_AREA_UPPERBANK 1664
92-
#define DEF_XMM_OFFS(regnum) xmm ## regnum ## _off = xmm_off + (regnum)*16/BytesPerInt, xmm ## regnum ## H_off
93-
#define DEF_YMM_OFFS(regnum) ymm ## regnum ## _off = ymm_off + (regnum)*16/BytesPerInt, ymm ## regnum ## H_off
94-
#define DEF_ZMM_OFFS(regnum) zmm ## regnum ## _off = zmm_off + (regnum-16)*64/BytesPerInt, zmm ## regnum ## H_off
92+
#define DEF_XMM_OFFS(regnum) xmm ## regnum ## _off = xmm_off + (regnum)*16/BytesPerInt, xmm ## regnum ## H_off
93+
#define DEF_YMM_OFFS(regnum) ymm ## regnum ## _off = ymm_off + (regnum)*16/BytesPerInt, ymm ## regnum ## H_off
94+
#define DEF_ZMM_OFFS(regnum) zmm ## regnum ## _off = zmm_off + (regnum)*32/BytesPerInt, zmm ## regnum ## H_off
95+
#define DEF_ZMM_UPPER_OFFS(regnum) zmm ## regnum ## _off = zmm_upper_off + (regnum-16)*64/BytesPerInt, zmm ## regnum ## H_off
9596
enum layout {
9697
fpu_state_off = frame::arg_reg_save_area_bytes/BytesPerInt, // fxsave save area
9798
xmm_off = fpu_state_off + XSAVE_AREA_BEGIN/BytesPerInt, // offset in fxsave save area
@@ -102,10 +103,12 @@ class RegisterSaver {
102103
DEF_YMM_OFFS(0),
103104
DEF_YMM_OFFS(1),
104105
// 2..15 are implied in range usage
105-
zmm_high = xmm_off + (XSAVE_AREA_ZMM_BEGIN - XSAVE_AREA_BEGIN)/BytesPerInt,
106-
zmm_off = xmm_off + (XSAVE_AREA_UPPERBANK - XSAVE_AREA_BEGIN)/BytesPerInt,
107-
DEF_ZMM_OFFS(16),
108-
DEF_ZMM_OFFS(17),
106+
zmm_off = xmm_off + (XSAVE_AREA_ZMM_BEGIN - XSAVE_AREA_BEGIN)/BytesPerInt,
107+
DEF_ZMM_OFFS(0),
108+
DEF_ZMM_OFFS(1),
109+
zmm_upper_off = xmm_off + (XSAVE_AREA_UPPERBANK - XSAVE_AREA_BEGIN)/BytesPerInt,
110+
DEF_ZMM_UPPER_OFFS(16),
111+
DEF_ZMM_UPPER_OFFS(17),
109112
// 18..31 are implied in range usage
110113
fpu_state_end = fpu_state_off + ((FPUStateSizeInWords-1)*wordSize / BytesPerInt),
111114
fpu_stateH_end,
@@ -259,7 +262,7 @@ OopMap* RegisterSaver::save_live_registers(MacroAssembler* masm, int additional_
259262
map->set_callee_saved(STACK_OFFSET(off), xmm_name->as_VMReg());
260263
off += delta;
261264
}
262-
if(UseAVX > 2) {
265+
if (UseAVX > 2) {
263266
// Obtain xmm16..xmm31 from the XSAVE area on EVEX enabled targets
264267
off = zmm16_off;
265268
delta = zmm17_off - off;
@@ -272,13 +275,24 @@ OopMap* RegisterSaver::save_live_registers(MacroAssembler* masm, int additional_
272275

273276
#if COMPILER2_OR_JVMCI
274277
if (save_vectors) {
278+
// Save upper half of YMM registers(0..15)
275279
off = ymm0_off;
276-
int delta = ymm1_off - off;
280+
delta = ymm1_off - ymm0_off;
277281
for (int n = 0; n < 16; n++) {
278282
XMMRegister ymm_name = as_XMMRegister(n);
279283
map->set_callee_saved(STACK_OFFSET(off), ymm_name->as_VMReg()->next(4));
280284
off += delta;
281285
}
286+
if (VM_Version::supports_evex()) {
287+
// Save upper half of ZMM registers(0..15)
288+
off = zmm0_off;
289+
delta = zmm1_off - zmm0_off;
290+
for (int n = 0; n < 16; n++) {
291+
XMMRegister zmm_name = as_XMMRegister(n);
292+
map->set_callee_saved(STACK_OFFSET(off), zmm_name->as_VMReg()->next(8));
293+
off += delta;
294+
}
295+
}
282296
}
283297
#endif // COMPILER2_OR_JVMCI
284298

0 commit comments

Comments
 (0)