@@ -89,9 +89,10 @@ class RegisterSaver {
89
89
#define XSAVE_AREA_YMM_BEGIN 576
90
90
#define XSAVE_AREA_ZMM_BEGIN 1152
91
91
#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
95
96
enum layout {
96
97
fpu_state_off = frame::arg_reg_save_area_bytes/BytesPerInt, // fxsave save area
97
98
xmm_off = fpu_state_off + XSAVE_AREA_BEGIN/BytesPerInt, // offset in fxsave save area
@@ -102,10 +103,12 @@ class RegisterSaver {
102
103
DEF_YMM_OFFS (0 ),
103
104
DEF_YMM_OFFS (1 ),
104
105
// 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 ),
109
112
// 18..31 are implied in range usage
110
113
fpu_state_end = fpu_state_off + ((FPUStateSizeInWords-1 )*wordSize / BytesPerInt),
111
114
fpu_stateH_end,
@@ -259,7 +262,7 @@ OopMap* RegisterSaver::save_live_registers(MacroAssembler* masm, int additional_
259
262
map->set_callee_saved (STACK_OFFSET (off), xmm_name->as_VMReg ());
260
263
off += delta;
261
264
}
262
- if (UseAVX > 2 ) {
265
+ if (UseAVX > 2 ) {
263
266
// Obtain xmm16..xmm31 from the XSAVE area on EVEX enabled targets
264
267
off = zmm16_off;
265
268
delta = zmm17_off - off;
@@ -272,13 +275,24 @@ OopMap* RegisterSaver::save_live_registers(MacroAssembler* masm, int additional_
272
275
273
276
#if COMPILER2_OR_JVMCI
274
277
if (save_vectors) {
278
+ // Save upper half of YMM registers(0..15)
275
279
off = ymm0_off;
276
- int delta = ymm1_off - off ;
280
+ delta = ymm1_off - ymm0_off ;
277
281
for (int n = 0 ; n < 16 ; n++) {
278
282
XMMRegister ymm_name = as_XMMRegister (n);
279
283
map->set_callee_saved (STACK_OFFSET (off), ymm_name->as_VMReg ()->next (4 ));
280
284
off += delta;
281
285
}
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
+ }
282
296
}
283
297
#endif // COMPILER2_OR_JVMCI
284
298
0 commit comments