]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/i387-tdep.c
sim: ppc: use correct macros
[thirdparty/binutils-gdb.git] / gdb / i387-tdep.c
CommitLineData
c906108c 1/* Intel 387 floating point stuff.
38edeab8 2
d01e8234 3 Copyright (C) 1988-2025 Free Software Foundation, Inc.
c906108c 4
c5aa993b 5 This file is part of GDB.
c906108c 6
c5aa993b
JM
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
a9762ec7 9 the Free Software Foundation; either version 3 of the License, or
c5aa993b 10 (at your option) any later version.
c906108c 11
c5aa993b
JM
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
c906108c 16
c5aa993b 17 You should have received a copy of the GNU General Public License
a9762ec7 18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
c906108c 19
ec452525 20#include "extract-store-integer.h"
c906108c 21#include "frame.h"
786a90bb 22#include "gdbcore.h"
c906108c
SS
23#include "inferior.h"
24#include "language.h"
4e052eda 25#include "regcache.h"
f69fdf9b 26#include "target-float.h"
786a90bb
MK
27#include "value.h"
28
9a82579f 29#include "i386-tdep.h"
42c466d7 30#include "i387-tdep.h"
268a13a5 31#include "gdbsupport/x86-xstate.h"
c906108c 32
de57eccd 33/* Print the floating point number specified by RAW. */
786a90bb 34
de57eccd 35static void
27067745
UW
36print_i387_value (struct gdbarch *gdbarch,
37 const gdb_byte *raw, struct ui_file *file)
de57eccd 38{
de57eccd
JM
39 /* We try to print 19 digits. The last digit may or may not contain
40 garbage, but we'd better print one too many. We need enough room
41 to print the value, 1 position for the sign, 1 for the decimal
42 point, 19 for the digits and 6 for the exponent adds up to 27. */
f69fdf9b
UW
43 const struct type *type = i387_ext_type (gdbarch);
44 std::string str = target_float_to_string (raw, type, " %-+27.19g");
6cb06a8c 45 gdb_printf (file, "%s", str.c_str ());
de57eccd
JM
46}
47
48/* Print the classification for the register contents RAW. */
786a90bb 49
de57eccd 50static void
27067745
UW
51print_i387_ext (struct gdbarch *gdbarch,
52 const gdb_byte *raw, struct ui_file *file)
de57eccd
JM
53{
54 int sign;
55 int integer;
56 unsigned int exponent;
57 unsigned long fraction[2];
58
59 sign = raw[9] & 0x80;
60 integer = raw[7] & 0x80;
61 exponent = (((raw[9] & 0x7f) << 8) | raw[8]);
62 fraction[0] = ((raw[3] << 24) | (raw[2] << 16) | (raw[1] << 8) | raw[0]);
63 fraction[1] = (((raw[7] & 0x7f) << 24) | (raw[6] << 16)
64 | (raw[5] << 8) | raw[4]);
65
66 if (exponent == 0x7fff && integer)
67 {
68 if (fraction[0] == 0x00000000 && fraction[1] == 0x00000000)
69 /* Infinity. */
6cb06a8c 70 gdb_printf (file, " %cInf", (sign ? '-' : '+'));
de57eccd
JM
71 else if (sign && fraction[0] == 0x00000000 && fraction[1] == 0x40000000)
72 /* Real Indefinite (QNaN). */
0426ad51 73 gdb_puts (" Real Indefinite (QNaN)", file);
de57eccd
JM
74 else if (fraction[1] & 0x40000000)
75 /* QNaN. */
0426ad51 76 gdb_puts (" QNaN", file);
de57eccd
JM
77 else
78 /* SNaN. */
0426ad51 79 gdb_puts (" SNaN", file);
de57eccd
JM
80 }
81 else if (exponent < 0x7fff && exponent > 0x0000 && integer)
82 /* Normal. */
27067745 83 print_i387_value (gdbarch, raw, file);
de57eccd
JM
84 else if (exponent == 0x0000)
85 {
86 /* Denormal or zero. */
27067745 87 print_i387_value (gdbarch, raw, file);
de57eccd
JM
88
89 if (integer)
90 /* Pseudo-denormal. */
0426ad51 91 gdb_puts (" Pseudo-denormal", file);
de57eccd
JM
92 else if (fraction[0] || fraction[1])
93 /* Denormal. */
0426ad51 94 gdb_puts (" Denormal", file);
de57eccd
JM
95 }
96 else
97 /* Unsupported. */
0426ad51 98 gdb_puts (" Unsupported", file);
de57eccd
JM
99}
100
ad5f7d6e
PA
101/* Print the status word STATUS. If STATUS_P is false, then STATUS
102 was unavailable. */
786a90bb 103
de57eccd 104static void
ad5f7d6e
PA
105print_i387_status_word (int status_p,
106 unsigned int status, struct ui_file *file)
de57eccd 107{
6cb06a8c 108 gdb_printf (file, "Status Word: ");
ad5f7d6e
PA
109 if (!status_p)
110 {
6cb06a8c 111 gdb_printf (file, "%s\n", _("<unavailable>"));
ad5f7d6e
PA
112 return;
113 }
114
6cb06a8c 115 gdb_printf (file, "%s", hex_string_custom (status, 4));
0426ad51 116 gdb_puts (" ", file);
6cb06a8c
TT
117 gdb_printf (file, " %s", (status & 0x0001) ? "IE" : " ");
118 gdb_printf (file, " %s", (status & 0x0002) ? "DE" : " ");
119 gdb_printf (file, " %s", (status & 0x0004) ? "ZE" : " ");
120 gdb_printf (file, " %s", (status & 0x0008) ? "OE" : " ");
121 gdb_printf (file, " %s", (status & 0x0010) ? "UE" : " ");
122 gdb_printf (file, " %s", (status & 0x0020) ? "PE" : " ");
0426ad51 123 gdb_puts (" ", file);
6cb06a8c 124 gdb_printf (file, " %s", (status & 0x0080) ? "ES" : " ");
0426ad51 125 gdb_puts (" ", file);
6cb06a8c 126 gdb_printf (file, " %s", (status & 0x0040) ? "SF" : " ");
0426ad51 127 gdb_puts (" ", file);
6cb06a8c
TT
128 gdb_printf (file, " %s", (status & 0x0100) ? "C0" : " ");
129 gdb_printf (file, " %s", (status & 0x0200) ? "C1" : " ");
130 gdb_printf (file, " %s", (status & 0x0400) ? "C2" : " ");
131 gdb_printf (file, " %s", (status & 0x4000) ? "C3" : " ");
61113f8b 132
0426ad51 133 gdb_puts ("\n", file);
61113f8b 134
6cb06a8c
TT
135 gdb_printf (file,
136 " TOP: %d\n", ((status >> 11) & 7));
de57eccd
JM
137}
138
ad5f7d6e
PA
139/* Print the control word CONTROL. If CONTROL_P is false, then
140 CONTROL was unavailable. */
786a90bb 141
de57eccd 142static void
ad5f7d6e
PA
143print_i387_control_word (int control_p,
144 unsigned int control, struct ui_file *file)
de57eccd 145{
6cb06a8c 146 gdb_printf (file, "Control Word: ");
ad5f7d6e
PA
147 if (!control_p)
148 {
6cb06a8c 149 gdb_printf (file, "%s\n", _("<unavailable>"));
ad5f7d6e
PA
150 return;
151 }
152
6cb06a8c 153 gdb_printf (file, "%s", hex_string_custom (control, 4));
0426ad51 154 gdb_puts (" ", file);
6cb06a8c
TT
155 gdb_printf (file, " %s", (control & 0x0001) ? "IM" : " ");
156 gdb_printf (file, " %s", (control & 0x0002) ? "DM" : " ");
157 gdb_printf (file, " %s", (control & 0x0004) ? "ZM" : " ");
158 gdb_printf (file, " %s", (control & 0x0008) ? "OM" : " ");
159 gdb_printf (file, " %s", (control & 0x0010) ? "UM" : " ");
160 gdb_printf (file, " %s", (control & 0x0020) ? "PM" : " ");
de57eccd 161
0426ad51 162 gdb_puts ("\n", file);
de57eccd 163
0426ad51 164 gdb_puts (" PC: ", file);
de57eccd
JM
165 switch ((control >> 8) & 3)
166 {
167 case 0:
0426ad51 168 gdb_puts ("Single Precision (24-bits)\n", file);
de57eccd
JM
169 break;
170 case 1:
0426ad51 171 gdb_puts ("Reserved\n", file);
de57eccd
JM
172 break;
173 case 2:
0426ad51 174 gdb_puts ("Double Precision (53-bits)\n", file);
de57eccd
JM
175 break;
176 case 3:
0426ad51 177 gdb_puts ("Extended Precision (64-bits)\n", file);
de57eccd
JM
178 break;
179 }
180
0426ad51 181 gdb_puts (" RC: ", file);
de57eccd
JM
182 switch ((control >> 10) & 3)
183 {
184 case 0:
0426ad51 185 gdb_puts ("Round to nearest\n", file);
de57eccd
JM
186 break;
187 case 1:
0426ad51 188 gdb_puts ("Round down\n", file);
de57eccd
JM
189 break;
190 case 2:
0426ad51 191 gdb_puts ("Round up\n", file);
de57eccd
JM
192 break;
193 case 3:
0426ad51 194 gdb_puts ("Round toward zero\n", file);
de57eccd
JM
195 break;
196 }
197}
198
9b949a49 199/* Print out the i387 floating point state. Note that we ignore FRAME
7d8d2918
MK
200 in the code below. That's OK since floating-point registers are
201 never saved on the stack. */
202
de57eccd 203void
61113f8b 204i387_print_float_info (struct gdbarch *gdbarch, struct ui_file *file,
8480a37e 205 const frame_info_ptr &frame, const char *args)
de57eccd 206{
08106042 207 i386_gdbarch_tdep *tdep = gdbarch_tdep<i386_gdbarch_tdep> (gdbarch);
1d70089a 208 ULONGEST fctrl;
ad5f7d6e 209 int fctrl_p;
1d70089a 210 ULONGEST fstat;
ad5f7d6e 211 int fstat_p;
1d70089a 212 ULONGEST ftag;
ad5f7d6e 213 int ftag_p;
1d70089a 214 ULONGEST fiseg;
ad5f7d6e 215 int fiseg_p;
1d70089a 216 ULONGEST fioff;
ad5f7d6e 217 int fioff_p;
1d70089a 218 ULONGEST foseg;
ad5f7d6e 219 int foseg_p;
1d70089a 220 ULONGEST fooff;
ad5f7d6e 221 int fooff_p;
1d70089a 222 ULONGEST fop;
ad5f7d6e 223 int fop_p;
de57eccd
JM
224 int fpreg;
225 int top;
226
5716833c
MK
227 gdb_assert (gdbarch == get_frame_arch (frame));
228
ad5f7d6e
PA
229 fctrl_p = read_frame_register_unsigned (frame,
230 I387_FCTRL_REGNUM (tdep), &fctrl);
231 fstat_p = read_frame_register_unsigned (frame,
232 I387_FSTAT_REGNUM (tdep), &fstat);
233 ftag_p = read_frame_register_unsigned (frame,
234 I387_FTAG_REGNUM (tdep), &ftag);
235 fiseg_p = read_frame_register_unsigned (frame,
236 I387_FISEG_REGNUM (tdep), &fiseg);
237 fioff_p = read_frame_register_unsigned (frame,
238 I387_FIOFF_REGNUM (tdep), &fioff);
239 foseg_p = read_frame_register_unsigned (frame,
240 I387_FOSEG_REGNUM (tdep), &foseg);
241 fooff_p = read_frame_register_unsigned (frame,
242 I387_FOOFF_REGNUM (tdep), &fooff);
243 fop_p = read_frame_register_unsigned (frame,
244 I387_FOP_REGNUM (tdep), &fop);
245
246 if (fstat_p)
de57eccd 247 {
ad5f7d6e 248 top = ((fstat >> 11) & 7);
de57eccd 249
ad5f7d6e 250 for (fpreg = 7; fpreg >= 0; fpreg--)
de57eccd 251 {
ad5f7d6e
PA
252 struct value *regval;
253 int regnum;
254 int i;
255 int tag = -1;
256
6cb06a8c 257 gdb_printf (file, "%sR%d: ", fpreg == top ? "=>" : " ", fpreg);
ad5f7d6e
PA
258
259 if (ftag_p)
260 {
261 tag = (ftag >> (fpreg * 2)) & 3;
262
263 switch (tag)
264 {
265 case 0:
0426ad51 266 gdb_puts ("Valid ", file);
ad5f7d6e
PA
267 break;
268 case 1:
0426ad51 269 gdb_puts ("Zero ", file);
ad5f7d6e
PA
270 break;
271 case 2:
0426ad51 272 gdb_puts ("Special ", file);
ad5f7d6e
PA
273 break;
274 case 3:
0426ad51 275 gdb_puts ("Empty ", file);
ad5f7d6e
PA
276 break;
277 }
278 }
279 else
0426ad51 280 gdb_puts ("Unknown ", file);
ad5f7d6e
PA
281
282 regnum = (fpreg + 8 - top) % 8 + I387_ST0_REGNUM (tdep);
283 regval = get_frame_register_value (frame, regnum);
284
d00664db 285 if (regval->entirely_available ())
ad5f7d6e 286 {
efaf1ae0 287 const gdb_byte *raw = regval->contents ().data ();
ad5f7d6e 288
0426ad51 289 gdb_puts ("0x", file);
ad5f7d6e 290 for (i = 9; i >= 0; i--)
6cb06a8c 291 gdb_printf (file, "%02x", raw[i]);
ad5f7d6e
PA
292
293 if (tag != -1 && tag != 3)
294 print_i387_ext (gdbarch, raw, file);
295 }
296 else
6cb06a8c 297 gdb_printf (file, "%s", _("<unavailable>"));
ad5f7d6e 298
0426ad51 299 gdb_puts ("\n", file);
de57eccd 300 }
de57eccd
JM
301 }
302
0426ad51 303 gdb_puts ("\n", file);
ad5f7d6e
PA
304 print_i387_status_word (fstat_p, fstat, file);
305 print_i387_control_word (fctrl_p, fctrl, file);
6cb06a8c
TT
306 gdb_printf (file, "Tag Word: %s\n",
307 ftag_p ? hex_string_custom (ftag, 4) : _("<unavailable>"));
308 gdb_printf (file, "Instruction Pointer: %s:",
309 fiseg_p ? hex_string_custom (fiseg, 2) : _("<unavailable>"));
310 gdb_printf (file, "%s\n",
311 fioff_p ? hex_string_custom (fioff, 8) : _("<unavailable>"));
312 gdb_printf (file, "Operand Pointer: %s:",
313 foseg_p ? hex_string_custom (foseg, 2) : _("<unavailable>"));
314 gdb_printf (file, "%s\n",
315 fooff_p ? hex_string_custom (fooff, 8) : _("<unavailable>"));
316 gdb_printf (file, "Opcode: %s\n",
317 fop_p
318 ? (hex_string_custom (fop ? (fop | 0xd800) : 0, 4))
319 : _("<unavailable>"));
de57eccd 320}
d532c08f
MK
321\f
322
83acabca
DJ
323/* Return nonzero if a value of type TYPE stored in register REGNUM
324 needs any special handling. */
325
326int
1777feb0
MS
327i387_convert_register_p (struct gdbarch *gdbarch, int regnum,
328 struct type *type)
83acabca 329{
20a6ec49 330 if (i386_fp_regnum_p (gdbarch, regnum))
83acabca
DJ
331 {
332 /* Floating point registers must be converted unless we are
8c8f9122
YQ
333 accessing them in their hardware type or TYPE is not float. */
334 if (type == i387_ext_type (gdbarch)
78134374 335 || type->code () != TYPE_CODE_FLT)
83acabca
DJ
336 return 0;
337 else
338 return 1;
339 }
340
341 return 0;
342}
343
d532c08f
MK
344/* Read a value of type TYPE from register REGNUM in frame FRAME, and
345 return its contents in TO. */
346
8dccd430 347int
8480a37e 348i387_register_to_value (const frame_info_ptr &frame, int regnum,
8dccd430
PA
349 struct type *type, gdb_byte *to,
350 int *optimizedp, int *unavailablep)
d532c08f 351{
27067745 352 struct gdbarch *gdbarch = get_frame_arch (frame);
b4ad899f 353 gdb_byte from[I386_MAX_REGISTER_SIZE];
d532c08f 354
27067745 355 gdb_assert (i386_fp_regnum_p (gdbarch, regnum));
d532c08f
MK
356
357 /* We only support floating-point values. */
78134374 358 if (type->code () != TYPE_CODE_FLT)
d532c08f 359 {
8a3fe4f8
AC
360 warning (_("Cannot convert floating-point register value "
361 "to non-floating-point type."));
8dccd430
PA
362 *optimizedp = *unavailablep = 0;
363 return 0;
d532c08f
MK
364 }
365
83acabca 366 /* Convert to TYPE. */
9fc79b42
SM
367 auto from_view
368 = gdb::make_array_view (from, register_size (gdbarch, regnum));
369 frame_info_ptr next_frame = get_next_frame_sentinel_okay (frame);
370 if (!get_frame_register_bytes (next_frame, regnum, 0, from_view, optimizedp,
371 unavailablep))
8dccd430
PA
372 return 0;
373
3b2ca824 374 target_float_convert (from, i387_ext_type (gdbarch), to, type);
8dccd430
PA
375 *optimizedp = *unavailablep = 0;
376 return 1;
d532c08f
MK
377}
378
379/* Write the contents FROM of a value of type TYPE into register
380 REGNUM in frame FRAME. */
381
382void
8480a37e 383i387_value_to_register (const frame_info_ptr &frame, int regnum,
42835c2b 384 struct type *type, const gdb_byte *from)
d532c08f 385{
27067745 386 struct gdbarch *gdbarch = get_frame_arch (frame);
b4ad899f 387 gdb_byte to[I386_MAX_REGISTER_SIZE];
d532c08f 388
27067745 389 gdb_assert (i386_fp_regnum_p (gdbarch, regnum));
d532c08f
MK
390
391 /* We only support floating-point values. */
78134374 392 if (type->code () != TYPE_CODE_FLT)
d532c08f 393 {
8a3fe4f8
AC
394 warning (_("Cannot convert non-floating-point type "
395 "to floating-point register value."));
d532c08f
MK
396 return;
397 }
398
83acabca 399 /* Convert from TYPE. */
f6e3d557
SM
400 struct type *to_type = i387_ext_type (gdbarch);
401 target_float_convert (from, type, to, to_type);
402 auto to_view = gdb::make_array_view (to, to_type->length ());
584468de 403 put_frame_register (get_next_frame_sentinel_okay (frame), regnum, to_view);
d532c08f
MK
404}
405\f
e750d25e 406
786a90bb 407/* Handle FSAVE and FXSAVE formats. */
e750d25e
JT
408
409/* At fsave_offset[REGNUM] you'll find the offset to the location in
410 the data structure used by the "fsave" instruction where GDB
411 register REGNUM is stored. */
412
413static int fsave_offset[] =
414{
5716833c
MK
415 28 + 0 * 10, /* %st(0) ... */
416 28 + 1 * 10,
417 28 + 2 * 10,
418 28 + 3 * 10,
419 28 + 4 * 10,
420 28 + 5 * 10,
421 28 + 6 * 10,
422 28 + 7 * 10, /* ... %st(7). */
423 0, /* `fctrl' (16 bits). */
424 4, /* `fstat' (16 bits). */
425 8, /* `ftag' (16 bits). */
426 16, /* `fiseg' (16 bits). */
427 12, /* `fioff'. */
428 24, /* `foseg' (16 bits). */
429 20, /* `fooff'. */
430 18 /* `fop' (bottom 11 bits). */
e750d25e
JT
431};
432
20a6ec49
MD
433#define FSAVE_ADDR(tdep, fsave, regnum) \
434 (fsave + fsave_offset[regnum - I387_ST0_REGNUM (tdep)])
e750d25e
JT
435\f
436
41d041d6
MK
437/* Fill register REGNUM in REGCACHE with the appropriate value from
438 *FSAVE. This function masks off any of the reserved bits in
439 *FSAVE. */
e750d25e
JT
440
441void
41d041d6 442i387_supply_fsave (struct regcache *regcache, int regnum, const void *fsave)
e750d25e 443{
ac7936df 444 struct gdbarch *gdbarch = regcache->arch ();
08106042 445 i386_gdbarch_tdep *tdep = gdbarch_tdep<i386_gdbarch_tdep> (gdbarch);
e17a4113 446 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
9a3c8263 447 const gdb_byte *regs = (const gdb_byte *) fsave;
e750d25e
JT
448 int i;
449
5716833c
MK
450 gdb_assert (tdep->st0_regnum >= I386_ST0_REGNUM);
451
20a6ec49 452 for (i = I387_ST0_REGNUM (tdep); i < I387_XMM0_REGNUM (tdep); i++)
ed504bdf
MK
453 if (regnum == -1 || regnum == i)
454 {
455 if (fsave == NULL)
456 {
73e1c03f 457 regcache->raw_supply (i, NULL);
5716833c 458 continue;
ed504bdf
MK
459 }
460
461 /* Most of the FPU control registers occupy only 16 bits in the
462 fsave area. Give those a special treatment. */
20a6ec49
MD
463 if (i >= I387_FCTRL_REGNUM (tdep)
464 && i != I387_FIOFF_REGNUM (tdep) && i != I387_FOOFF_REGNUM (tdep))
ed504bdf 465 {
b4ad899f 466 gdb_byte val[4];
ed504bdf 467
20a6ec49 468 memcpy (val, FSAVE_ADDR (tdep, regs, i), 2);
ed504bdf 469 val[2] = val[3] = 0;
20a6ec49 470 if (i == I387_FOP_REGNUM (tdep))
ed504bdf 471 val[1] &= ((1 << 3) - 1);
73e1c03f 472 regcache->raw_supply (i, val);
ed504bdf
MK
473 }
474 else
73e1c03f 475 regcache->raw_supply (i, FSAVE_ADDR (tdep, regs, i));
ed504bdf 476 }
b87bc0d8
MK
477
478 /* Provide dummy values for the SSE registers. */
20a6ec49 479 for (i = I387_XMM0_REGNUM (tdep); i < I387_MXCSR_REGNUM (tdep); i++)
b87bc0d8 480 if (regnum == -1 || regnum == i)
73e1c03f 481 regcache->raw_supply (i, NULL);
20a6ec49 482 if (regnum == -1 || regnum == I387_MXCSR_REGNUM (tdep))
b87bc0d8 483 {
b4ad899f 484 gdb_byte buf[4];
b87bc0d8 485
8ee22052 486 store_unsigned_integer (buf, 4, byte_order, I387_MXCSR_INIT_VAL);
73e1c03f 487 regcache->raw_supply (I387_MXCSR_REGNUM (tdep), buf);
b87bc0d8 488 }
e750d25e
JT
489}
490
491/* Fill register REGNUM (if it is a floating-point register) in *FSAVE
63b6c53f
MK
492 with the value from REGCACHE. If REGNUM is -1, do this for all
493 registers. This function doesn't touch any of the reserved bits in
494 *FSAVE. */
e750d25e
JT
495
496void
63b6c53f 497i387_collect_fsave (const struct regcache *regcache, int regnum, void *fsave)
e750d25e 498{
345bd07c 499 gdbarch *arch = regcache->arch ();
08106042 500 i386_gdbarch_tdep *tdep = gdbarch_tdep<i386_gdbarch_tdep> (arch);
9a3c8263 501 gdb_byte *regs = (gdb_byte *) fsave;
e750d25e
JT
502 int i;
503
5716833c
MK
504 gdb_assert (tdep->st0_regnum >= I386_ST0_REGNUM);
505
20a6ec49 506 for (i = I387_ST0_REGNUM (tdep); i < I387_XMM0_REGNUM (tdep); i++)
e750d25e
JT
507 if (regnum == -1 || regnum == i)
508 {
509 /* Most of the FPU control registers occupy only 16 bits in
dda83cd7 510 the fsave area. Give those a special treatment. */
20a6ec49
MD
511 if (i >= I387_FCTRL_REGNUM (tdep)
512 && i != I387_FIOFF_REGNUM (tdep) && i != I387_FOOFF_REGNUM (tdep))
e750d25e 513 {
b4ad899f 514 gdb_byte buf[4];
e750d25e 515
34a79281 516 regcache->raw_collect (i, buf);
e750d25e 517
20a6ec49 518 if (i == I387_FOP_REGNUM (tdep))
e750d25e
JT
519 {
520 /* The opcode occupies only 11 bits. Make sure we
dda83cd7 521 don't touch the other bits. */
e750d25e 522 buf[1] &= ((1 << 3) - 1);
20a6ec49 523 buf[1] |= ((FSAVE_ADDR (tdep, regs, i))[1] & ~((1 << 3) - 1));
e750d25e 524 }
20a6ec49 525 memcpy (FSAVE_ADDR (tdep, regs, i), buf, 2);
e750d25e
JT
526 }
527 else
34a79281 528 regcache->raw_collect (i, FSAVE_ADDR (tdep, regs, i));
e750d25e
JT
529 }
530}
531\f
532
533/* At fxsave_offset[REGNUM] you'll find the offset to the location in
534 the data structure used by the "fxsave" instruction where GDB
535 register REGNUM is stored. */
536
537static int fxsave_offset[] =
538{
5716833c 539 32, /* %st(0) through ... */
e750d25e
JT
540 48,
541 64,
542 80,
543 96,
544 112,
545 128,
5716833c
MK
546 144, /* ... %st(7) (80 bits each). */
547 0, /* `fctrl' (16 bits). */
548 2, /* `fstat' (16 bits). */
549 4, /* `ftag' (16 bits). */
550 12, /* `fiseg' (16 bits). */
551 8, /* `fioff'. */
552 20, /* `foseg' (16 bits). */
553 16, /* `fooff'. */
554 6, /* `fop' (bottom 11 bits). */
555 160 + 0 * 16, /* %xmm0 through ... */
04c8243f
MK
556 160 + 1 * 16,
557 160 + 2 * 16,
558 160 + 3 * 16,
559 160 + 4 * 16,
560 160 + 5 * 16,
561 160 + 6 * 16,
562 160 + 7 * 16,
563 160 + 8 * 16,
564 160 + 9 * 16,
565 160 + 10 * 16,
566 160 + 11 * 16,
567 160 + 12 * 16,
568 160 + 13 * 16,
569 160 + 14 * 16,
5716833c 570 160 + 15 * 16, /* ... %xmm15 (128 bits each). */
e750d25e
JT
571};
572
20a6ec49
MD
573#define FXSAVE_ADDR(tdep, fxsave, regnum) \
574 (fxsave + fxsave_offset[regnum - I387_ST0_REGNUM (tdep)])
5716833c
MK
575
576/* We made an unfortunate choice in putting %mxcsr after the SSE
577 registers %xmm0-%xmm7 instead of before, since it makes supporting
578 the registers %xmm8-%xmm15 on AMD64 a bit involved. Therefore we
579 don't include the offset for %mxcsr here above. */
580
581#define FXSAVE_MXCSR_ADDR(fxsave) (fxsave + 24)
e750d25e 582
b4ad899f 583static int i387_tag (const gdb_byte *raw);
e750d25e
JT
584\f
585
41d041d6 586/* Fill register REGNUM in REGCACHE with the appropriate
ed504bdf
MK
587 floating-point or SSE register value from *FXSAVE. This function
588 masks off any of the reserved bits in *FXSAVE. */
e750d25e
JT
589
590void
41d041d6 591i387_supply_fxsave (struct regcache *regcache, int regnum, const void *fxsave)
e750d25e 592{
345bd07c 593 gdbarch *arch = regcache->arch ();
08106042 594 i386_gdbarch_tdep *tdep = gdbarch_tdep<i386_gdbarch_tdep> (arch);
9a3c8263 595 const gdb_byte *regs = (const gdb_byte *) fxsave;
5716833c
MK
596 int i;
597
598 gdb_assert (tdep->st0_regnum >= I386_ST0_REGNUM);
599 gdb_assert (tdep->num_xmm_regs > 0);
dff95cc7 600
20a6ec49 601 for (i = I387_ST0_REGNUM (tdep); i < I387_MXCSR_REGNUM (tdep); i++)
ed504bdf
MK
602 if (regnum == -1 || regnum == i)
603 {
5716833c 604 if (regs == NULL)
ed504bdf 605 {
73e1c03f 606 regcache->raw_supply (i, NULL);
ed504bdf
MK
607 continue;
608 }
932bb524 609
ed504bdf
MK
610 /* Most of the FPU control registers occupy only 16 bits in
611 the fxsave area. Give those a special treatment. */
20a6ec49
MD
612 if (i >= I387_FCTRL_REGNUM (tdep) && i < I387_XMM0_REGNUM (tdep)
613 && i != I387_FIOFF_REGNUM (tdep) && i != I387_FOOFF_REGNUM (tdep))
ed504bdf 614 {
b4ad899f 615 gdb_byte val[4];
ed504bdf 616
20a6ec49 617 memcpy (val, FXSAVE_ADDR (tdep, regs, i), 2);
ed504bdf 618 val[2] = val[3] = 0;
20a6ec49 619 if (i == I387_FOP_REGNUM (tdep))
ed504bdf 620 val[1] &= ((1 << 3) - 1);
20a6ec49 621 else if (i== I387_FTAG_REGNUM (tdep))
ed504bdf
MK
622 {
623 /* The fxsave area contains a simplified version of
624 the tag word. We have to look at the actual 80-bit
625 FP data to recreate the traditional i387 tag word. */
626
627 unsigned long ftag = 0;
628 int fpreg;
629 int top;
630
20a6ec49
MD
631 top = ((FXSAVE_ADDR (tdep, regs,
632 I387_FSTAT_REGNUM (tdep)))[1] >> 3);
5716833c 633 top &= 0x7;
ed504bdf
MK
634
635 for (fpreg = 7; fpreg >= 0; fpreg--)
636 {
637 int tag;
638
639 if (val[0] & (1 << fpreg))
640 {
6d5e094a 641 int thisreg = (fpreg + 8 - top) % 8
dda83cd7 642 + I387_ST0_REGNUM (tdep);
6d5e094a 643 tag = i387_tag (FXSAVE_ADDR (tdep, regs, thisreg));
ed504bdf
MK
644 }
645 else
646 tag = 3; /* Empty */
647
648 ftag |= tag << (2 * fpreg);
649 }
650 val[0] = ftag & 0xff;
651 val[1] = (ftag >> 8) & 0xff;
652 }
73e1c03f 653 regcache->raw_supply (i, val);
ed504bdf
MK
654 }
655 else
73e1c03f 656 regcache->raw_supply (i, FXSAVE_ADDR (tdep, regs, i));
ed504bdf 657 }
5716833c 658
20a6ec49 659 if (regnum == I387_MXCSR_REGNUM (tdep) || regnum == -1)
5716833c
MK
660 {
661 if (regs == NULL)
73e1c03f 662 regcache->raw_supply (I387_MXCSR_REGNUM (tdep), NULL);
5716833c 663 else
73e1c03f 664 regcache->raw_supply (I387_MXCSR_REGNUM (tdep),
5716833c
MK
665 FXSAVE_MXCSR_ADDR (regs));
666 }
e750d25e
JT
667}
668
669/* Fill register REGNUM (if it is a floating-point or SSE register) in
80571bff
MK
670 *FXSAVE with the value from REGCACHE. If REGNUM is -1, do this for
671 all registers. This function doesn't touch any of the reserved
672 bits in *FXSAVE. */
e750d25e
JT
673
674void
80571bff 675i387_collect_fxsave (const struct regcache *regcache, int regnum, void *fxsave)
e750d25e 676{
345bd07c 677 gdbarch *arch = regcache->arch ();
08106042 678 i386_gdbarch_tdep *tdep = gdbarch_tdep<i386_gdbarch_tdep> (arch);
9a3c8263 679 gdb_byte *regs = (gdb_byte *) fxsave;
5716833c
MK
680 int i;
681
682 gdb_assert (tdep->st0_regnum >= I386_ST0_REGNUM);
683 gdb_assert (tdep->num_xmm_regs > 0);
dff95cc7 684
20a6ec49 685 for (i = I387_ST0_REGNUM (tdep); i < I387_MXCSR_REGNUM (tdep); i++)
e750d25e
JT
686 if (regnum == -1 || regnum == i)
687 {
688 /* Most of the FPU control registers occupy only 16 bits in
dda83cd7 689 the fxsave area. Give those a special treatment. */
20a6ec49
MD
690 if (i >= I387_FCTRL_REGNUM (tdep) && i < I387_XMM0_REGNUM (tdep)
691 && i != I387_FIOFF_REGNUM (tdep) && i != I387_FOOFF_REGNUM (tdep))
e750d25e 692 {
b4ad899f 693 gdb_byte buf[4];
e750d25e 694
34a79281 695 regcache->raw_collect (i, buf);
e750d25e 696
31aeac78
L
697 if (i == I387_FOP_REGNUM (tdep))
698 {
699 /* The opcode occupies only 11 bits. Make sure we
dda83cd7 700 don't touch the other bits. */
31aeac78
L
701 buf[1] &= ((1 << 3) - 1);
702 buf[1] |= ((FXSAVE_ADDR (tdep, regs, i))[1] & ~((1 << 3) - 1));
703 }
704 else if (i == I387_FTAG_REGNUM (tdep))
705 {
706 /* Converting back is much easier. */
707
708 unsigned short ftag;
709 int fpreg;
710
711 ftag = (buf[1] << 8) | buf[0];
712 buf[0] = 0;
713 buf[1] = 0;
714
715 for (fpreg = 7; fpreg >= 0; fpreg--)
716 {
717 int tag = (ftag >> (fpreg * 2)) & 3;
718
719 if (tag != 3)
720 buf[0] |= (1 << fpreg);
721 }
722 }
723 memcpy (FXSAVE_ADDR (tdep, regs, i), buf, 2);
724 }
725 else
34a79281 726 regcache->raw_collect (i, FXSAVE_ADDR (tdep, regs, i));
31aeac78
L
727 }
728
729 if (regnum == I387_MXCSR_REGNUM (tdep) || regnum == -1)
34a79281 730 regcache->raw_collect (I387_MXCSR_REGNUM (tdep),
31aeac78
L
731 FXSAVE_MXCSR_ADDR (regs));
732}
733
734/* `xstate_bv' is at byte offset 512. */
735#define XSAVE_XSTATE_BV_ADDR(xsave) (xsave + 512)
736
8938f531
JB
737/* At xsave_avxh_offset[REGNUM] you'll find the relative offset within
738 the AVX region of the XSAVE extended state where the upper 128bits
739 of GDB register YMM0 + REGNUM is stored. */
31aeac78
L
740
741static int xsave_avxh_offset[] =
742{
8938f531
JB
743 0 * 16, /* Upper 128bit of %ymm0 through ... */
744 1 * 16,
745 2 * 16,
746 3 * 16,
747 4 * 16,
748 5 * 16,
749 6 * 16,
750 7 * 16,
751 8 * 16,
752 9 * 16,
753 10 * 16,
754 11 * 16,
755 12 * 16,
756 13 * 16,
757 14 * 16,
758 15 * 16 /* Upper 128bit of ... %ymm15 (128 bits each). */
31aeac78
L
759};
760
8938f531
JB
761#define XSAVE_AVXH_ADDR(tdep, xsave, regnum) \
762 (xsave + (tdep)->xsave_layout.avx_offset \
763 + xsave_avxh_offset[regnum - I387_YMM0H_REGNUM (tdep)])
01f9f808 764
c7e4521c 765/* At xsave_ymm_h_avx512_offset[REGNUM] you'll find the relative offset
8938f531
JB
766 within the ZMM region of the XSAVE extended state where the second
767 128bits of GDB register YMM16 + REGNUM is stored. */
01f9f808 768
c7e4521c 769static int xsave_ymm_h_avx512_offset[] =
01f9f808 770{
8938f531
JB
771 16 + 0 * 64, /* %ymm16 through... */
772 16 + 1 * 64,
773 16 + 2 * 64,
774 16 + 3 * 64,
775 16 + 4 * 64,
776 16 + 5 * 64,
777 16 + 6 * 64,
778 16 + 7 * 64,
779 16 + 8 * 64,
780 16 + 9 * 64,
781 16 + 10 * 64,
782 16 + 11 * 64,
783 16 + 12 * 64,
784 16 + 13 * 64,
785 16 + 14 * 64,
786 16 + 15 * 64 /* ... %ymm31 (128 bits each). */
01f9f808
MS
787};
788
c7e4521c 789#define XSAVE_YMM_H_AVX512_ADDR(tdep, xsave, regnum) \
8938f531 790 (xsave + (tdep)->xsave_layout.zmm_offset \
c7e4521c 791 + xsave_ymm_h_avx512_offset[regnum - I387_YMM16H_REGNUM (tdep)])
8938f531
JB
792
793/* At xsave_xmm_avx512_offset[REGNUM] you'll find the relative offset
794 within the ZMM region of the XSAVE extended state where the first
795 128bits of GDB register XMM16 + REGNUM is stored. */
01f9f808
MS
796
797static int xsave_xmm_avx512_offset[] =
1dbcd68c 798{
8938f531
JB
799 0 * 64, /* %xmm16 through... */
800 1 * 64,
801 2 * 64,
802 3 * 64,
803 4 * 64,
804 5 * 64,
805 6 * 64,
806 7 * 64,
807 8 * 64,
808 9 * 64,
809 10 * 64,
810 11 * 64,
811 12 * 64,
812 13 * 64,
813 14 * 64,
814 15 * 64 /* ... %xmm31 (128 bits each). */
01f9f808
MS
815};
816
8938f531
JB
817#define XSAVE_XMM_AVX512_ADDR(tdep, xsave, regnum) \
818 (xsave + (tdep)->xsave_layout.zmm_offset \
819 + xsave_xmm_avx512_offset[regnum - I387_XMM16_REGNUM (tdep)])
820
8938f531
JB
821/* At xsave_avx512_k_offset[REGNUM] you'll find the relative offset
822 within the K region of the XSAVE extended state where the AVX512
823 opmask register K0 + REGNUM is stored. */
01f9f808
MS
824
825static int xsave_avx512_k_offset[] =
826{
8938f531
JB
827 0 * 8, /* %k0 through... */
828 1 * 8,
829 2 * 8,
830 3 * 8,
831 4 * 8,
832 5 * 8,
833 6 * 8,
834 7 * 8 /* %k7 (64 bits each). */
835};
836
837#define XSAVE_AVX512_K_ADDR(tdep, xsave, regnum) \
838 (xsave + (tdep)->xsave_layout.k_offset \
839 + xsave_avx512_k_offset[regnum - I387_K0_REGNUM (tdep)])
840
841
842/* At xsave_avx512_zmm0_h_offset[REGNUM] you find the relative offset
843 within the ZMM_H region of the XSAVE extended state where the upper
844 256bits of the GDB register ZMM0 + REGNUM is stored. */
845
846static int xsave_avx512_zmm0_h_offset[] =
847{
848 0 * 32, /* Upper 256bit of %zmmh0 through... */
849 1 * 32,
850 2 * 32,
851 3 * 32,
852 4 * 32,
853 5 * 32,
854 6 * 32,
855 7 * 32,
856 8 * 32,
857 9 * 32,
858 10 * 32,
859 11 * 32,
860 12 * 32,
861 13 * 32,
862 14 * 32,
863 15 * 32 /* Upper 256bit of... %zmmh15 (256 bits each). */
01f9f808
MS
864};
865
8938f531
JB
866#define XSAVE_AVX512_ZMM0_H_ADDR(tdep, xsave, regnum) \
867 (xsave + (tdep)->xsave_layout.zmm_h_offset \
868 + xsave_avx512_zmm0_h_offset[regnum - I387_ZMM0H_REGNUM (tdep)])
01f9f808 869
8938f531
JB
870/* At xsave_avx512_zmm16_h_offset[REGNUM] you find the relative offset
871 within the ZMM_H region of the XSAVE extended state where the upper
872 256bits of the GDB register ZMM16 + REGNUM is stored. */
01f9f808 873
8938f531 874static int xsave_avx512_zmm16_h_offset[] =
01f9f808 875{
8938f531
JB
876 32 + 0 * 64, /* Upper 256bit of... %zmmh16 (256 bits each). */
877 32 + 1 * 64,
878 32 + 2 * 64,
879 32 + 3 * 64,
880 32 + 4 * 64,
881 32 + 5 * 64,
882 32 + 6 * 64,
883 32 + 7 * 64,
884 32 + 8 * 64,
885 32 + 9 * 64,
886 32 + 10 * 64,
887 32 + 11 * 64,
888 32 + 12 * 64,
889 32 + 13 * 64,
890 32 + 14 * 64,
891 32 + 15 * 64 /* Upper 256bit of... %zmmh31 (256 bits each). */
01f9f808
MS
892};
893
8938f531
JB
894#define XSAVE_AVX512_ZMM16_H_ADDR(tdep, xsave, regnum) \
895 (xsave + (tdep)->xsave_layout.zmm_offset \
896 + xsave_avx512_zmm16_h_offset[regnum - I387_ZMM16H_REGNUM (tdep)])
01f9f808 897
8938f531
JB
898/* At xsave_pkeys_offset[REGNUM] you'll find the relative offset
899 within the PKEYS region of the XSAVE extended state where the PKRU
900 register is stored. */
51547df6
MS
901
902static int xsave_pkeys_offset[] =
903{
8938f531 904 0 * 8 /* %pkru (64 bits in XSTATE, 32-bit actually used by
51547df6
MS
905 instructions and applications). */
906};
907
8938f531
JB
908#define XSAVE_PKEYS_ADDR(tdep, xsave, regnum) \
909 (xsave + (tdep)->xsave_layout.pkru_offset \
910 + xsave_pkeys_offset[regnum - I387_PKRU_REGNUM (tdep)])
51547df6 911
8ee22052 912
c689d1fe
JB
913/* See i387-tdep.h. */
914
915bool
916i387_guess_xsave_layout (uint64_t xcr0, size_t xsave_size,
917 x86_xsave_layout &layout)
918{
919 if (HAS_PKRU (xcr0) && xsave_size == 2696)
920 {
921 /* Intel CPUs supporting PKRU. */
922 layout.avx_offset = 576;
c689d1fe
JB
923 layout.k_offset = 1088;
924 layout.zmm_h_offset = 1152;
925 layout.zmm_offset = 1664;
926 layout.pkru_offset = 2688;
927 }
928 else if (HAS_PKRU (xcr0) && xsave_size == 2440)
929 {
930 /* AMD CPUs supporting PKRU. */
931 layout.avx_offset = 576;
932 layout.k_offset = 832;
933 layout.zmm_h_offset = 896;
934 layout.zmm_offset = 1408;
935 layout.pkru_offset = 2432;
936 }
937 else if (HAS_AVX512 (xcr0) && xsave_size == 2688)
938 {
939 /* Intel CPUs supporting AVX512. */
940 layout.avx_offset = 576;
c689d1fe
JB
941 layout.k_offset = 1088;
942 layout.zmm_h_offset = 1152;
943 layout.zmm_offset = 1664;
944 }
fc143432
SC
945 /* As MPX has been removed, we need the additional check
946 (xsave_size == 1088) to allow reading AVX registers from corefiles
947 on CPUs with MPX as the highest supported feature. */
948 else if (HAS_AVX (xcr0) && (xsave_size == 832 || xsave_size == 1088))
c689d1fe
JB
949 {
950 /* Intel and AMD CPUs supporting AVX. */
951 layout.avx_offset = 576;
952 }
953 else
954 return false;
955
956 layout.sizeof_xsave = xsave_size;
957 return true;
958}
959
66637e20
JB
960/* See i387-tdep.h. */
961
962x86_xsave_layout
963i387_fallback_xsave_layout (uint64_t xcr0)
964{
965 x86_xsave_layout layout;
966
967 if (HAS_PKRU (xcr0))
968 {
969 /* Intel CPUs supporting PKRU. */
970 layout.avx_offset = 576;
66637e20
JB
971 layout.k_offset = 1088;
972 layout.zmm_h_offset = 1152;
973 layout.zmm_offset = 1664;
974 layout.pkru_offset = 2688;
975 layout.sizeof_xsave = 2696;
976 }
977 else if (HAS_AVX512 (xcr0))
978 {
979 /* Intel CPUs supporting AVX512. */
980 layout.avx_offset = 576;
66637e20
JB
981 layout.k_offset = 1088;
982 layout.zmm_h_offset = 1152;
983 layout.zmm_offset = 1664;
984 layout.sizeof_xsave = 2688;
985 }
66637e20
JB
986 else if (HAS_AVX (xcr0))
987 {
988 /* Intel and AMD CPUs supporting AVX. */
989 layout.avx_offset = 576;
990 layout.sizeof_xsave = 832;
991 }
992
993 return layout;
994}
995
8ee22052
AB
996/* Extract from XSAVE a bitset of the features that are available on the
997 target, but which have not yet been enabled. */
998
999ULONGEST
1000i387_xsave_get_clear_bv (struct gdbarch *gdbarch, const void *xsave)
1001{
1002 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
1003 const gdb_byte *regs = (const gdb_byte *) xsave;
08106042 1004 i386_gdbarch_tdep *tdep = gdbarch_tdep<i386_gdbarch_tdep> (gdbarch);
8ee22052
AB
1005
1006 /* Get `xstat_bv'. The supported bits in `xstat_bv' are 8 bytes. */
1007 ULONGEST xstate_bv = extract_unsigned_integer (XSAVE_XSTATE_BV_ADDR (regs),
1008 8, byte_order);
1009
1010 /* Clear part in vector registers if its bit in xstat_bv is zero. */
1011 ULONGEST clear_bv = (~(xstate_bv)) & tdep->xcr0;
1012
1013 return clear_bv;
1014}
1015
31aeac78
L
1016/* Similar to i387_supply_fxsave, but use XSAVE extended state. */
1017
1018void
1019i387_supply_xsave (struct regcache *regcache, int regnum,
1020 const void *xsave)
1021{
ac7936df 1022 struct gdbarch *gdbarch = regcache->arch ();
8ee22052 1023 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
08106042 1024 i386_gdbarch_tdep *tdep = gdbarch_tdep<i386_gdbarch_tdep> (gdbarch);
9a3c8263 1025 const gdb_byte *regs = (const gdb_byte *) xsave;
31aeac78 1026 int i;
b5420128
JB
1027 /* In 64-bit mode the split between "low" and "high" ZMM registers is at
1028 ZMM16. Outside of 64-bit mode there are no "high" ZMM registers at all.
1029 Precalculate the number to be used for the split point, with the all
1030 registers in the "low" portion outside of 64-bit mode. */
1031 unsigned int zmm_endlo_regnum = I387_ZMM0H_REGNUM (tdep)
1032 + std::min (tdep->num_zmm_regs, 16);
ff6527bb 1033 ULONGEST clear_bv;
31aeac78
L
1034 enum
1035 {
1036 none = 0x0,
1037 x87 = 0x1,
1038 sse = 0x2,
1039 avxh = 0x4,
fc143432
SC
1040 avx512_k = 0x8,
1041 avx512_zmm0_h = 0x10,
1042 avx512_zmm16_h = 0x20,
1043 avx512_ymmh_avx512 = 0x40,
1044 avx512_xmm_avx512 = 0x80,
1045 pkeys = 0x100,
1046 all = x87 | sse | avxh | avx512_k | avx512_zmm0_h | avx512_zmm16_h
1047 | avx512_ymmh_avx512 | avx512_xmm_avx512 | pkeys
31aeac78
L
1048 } regclass;
1049
275418ae 1050 gdb_assert (regs != NULL);
31aeac78
L
1051 gdb_assert (tdep->st0_regnum >= I386_ST0_REGNUM);
1052 gdb_assert (tdep->num_xmm_regs > 0);
1053
1054 if (regnum == -1)
1055 regclass = all;
51547df6
MS
1056 else if (regnum >= I387_PKRU_REGNUM (tdep)
1057 && regnum < I387_PKEYSEND_REGNUM (tdep))
1058 regclass = pkeys;
01f9f808 1059 else if (regnum >= I387_ZMM0H_REGNUM (tdep)
8938f531
JB
1060 && regnum < I387_ZMM16H_REGNUM (tdep))
1061 regclass = avx512_zmm0_h;
1062 else if (regnum >= I387_ZMM16H_REGNUM (tdep)
01f9f808 1063 && regnum < I387_ZMMENDH_REGNUM (tdep))
8938f531 1064 regclass = avx512_zmm16_h;
01f9f808
MS
1065 else if (regnum >= I387_K0_REGNUM (tdep)
1066 && regnum < I387_KEND_REGNUM (tdep))
1067 regclass = avx512_k;
1068 else if (regnum >= I387_YMM16H_REGNUM (tdep)
1069 && regnum < I387_YMMH_AVX512_END_REGNUM (tdep))
1070 regclass = avx512_ymmh_avx512;
1071 else if (regnum >= I387_XMM16_REGNUM (tdep)
1072 && regnum < I387_XMM_AVX512_END_REGNUM (tdep))
1073 regclass = avx512_xmm_avx512;
31aeac78
L
1074 else if (regnum >= I387_YMM0H_REGNUM (tdep)
1075 && regnum < I387_YMMENDH_REGNUM (tdep))
1076 regclass = avxh;
01f9f808 1077 else if (regnum >= I387_XMM0_REGNUM (tdep)
31aeac78
L
1078 && regnum < I387_MXCSR_REGNUM (tdep))
1079 regclass = sse;
1080 else if (regnum >= I387_ST0_REGNUM (tdep)
1081 && regnum < I387_FCTRL_REGNUM (tdep))
1082 regclass = x87;
1083 else
1084 regclass = none;
1085
8ee22052 1086 clear_bv = i387_xsave_get_clear_bv (gdbarch, xsave);
31aeac78 1087
b4d36fb8
PA
1088 /* With the delayed xsave mechanism, in between the program
1089 starting, and the program accessing the vector registers for the
1090 first time, the register's values are invalid. The kernel
1091 initializes register states to zero when they are set the first
1092 time in a program. This means that from the user-space programs'
1093 perspective, it's the same as if the registers have always been
1094 zero from the start of the program. Therefore, the debugger
275418ae 1095 should provide the same illusion to the user. */
b4d36fb8 1096
31aeac78
L
1097 switch (regclass)
1098 {
1099 case none:
1100 break;
1101
51547df6
MS
1102 case pkeys:
1103 if ((clear_bv & X86_XSTATE_PKRU))
39d45a70 1104 regcache->raw_supply_zeroed (regnum);
51547df6 1105 else
73e1c03f 1106 regcache->raw_supply (regnum, XSAVE_PKEYS_ADDR (tdep, regs, regnum));
51547df6
MS
1107 return;
1108
8938f531
JB
1109 case avx512_zmm0_h:
1110 if ((clear_bv & X86_XSTATE_ZMM_H))
39d45a70 1111 regcache->raw_supply_zeroed (regnum);
8938f531
JB
1112 else
1113 regcache->raw_supply (regnum,
1114 XSAVE_AVX512_ZMM0_H_ADDR (tdep, regs, regnum));
1115 return;
1116
1117 case avx512_zmm16_h:
1118 if ((clear_bv & X86_XSTATE_ZMM))
39d45a70 1119 regcache->raw_supply_zeroed (regnum);
01f9f808 1120 else
73e1c03f 1121 regcache->raw_supply (regnum,
8938f531 1122 XSAVE_AVX512_ZMM16_H_ADDR (tdep, regs, regnum));
01f9f808
MS
1123 return;
1124
1125 case avx512_k:
df7e5265 1126 if ((clear_bv & X86_XSTATE_K))
39d45a70 1127 regcache->raw_supply_zeroed (regnum);
01f9f808 1128 else
73e1c03f 1129 regcache->raw_supply (regnum, XSAVE_AVX512_K_ADDR (tdep, regs, regnum));
01f9f808
MS
1130 return;
1131
1132 case avx512_ymmh_avx512:
df7e5265 1133 if ((clear_bv & X86_XSTATE_ZMM))
39d45a70 1134 regcache->raw_supply_zeroed (regnum);
01f9f808 1135 else
73e1c03f 1136 regcache->raw_supply (regnum,
c7e4521c 1137 XSAVE_YMM_H_AVX512_ADDR (tdep, regs, regnum));
01f9f808
MS
1138 return;
1139
1140 case avx512_xmm_avx512:
df7e5265 1141 if ((clear_bv & X86_XSTATE_ZMM))
39d45a70 1142 regcache->raw_supply_zeroed (regnum);
01f9f808 1143 else
73e1c03f
SM
1144 regcache->raw_supply (regnum,
1145 XSAVE_XMM_AVX512_ADDR (tdep, regs, regnum));
01f9f808
MS
1146 return;
1147
31aeac78 1148 case avxh:
df7e5265 1149 if ((clear_bv & X86_XSTATE_AVX))
39d45a70 1150 regcache->raw_supply_zeroed (regnum);
31aeac78 1151 else
73e1c03f 1152 regcache->raw_supply (regnum, XSAVE_AVXH_ADDR (tdep, regs, regnum));
31aeac78
L
1153 return;
1154
1155 case sse:
df7e5265 1156 if ((clear_bv & X86_XSTATE_SSE))
39d45a70 1157 regcache->raw_supply_zeroed (regnum);
31aeac78 1158 else
73e1c03f 1159 regcache->raw_supply (regnum, FXSAVE_ADDR (tdep, regs, regnum));
31aeac78
L
1160 return;
1161
1162 case x87:
df7e5265 1163 if ((clear_bv & X86_XSTATE_X87))
39d45a70 1164 regcache->raw_supply_zeroed (regnum);
31aeac78 1165 else
73e1c03f 1166 regcache->raw_supply (regnum, FXSAVE_ADDR (tdep, regs, regnum));
31aeac78
L
1167 return;
1168
1169 case all:
51547df6
MS
1170 /* Handle PKEYS registers. */
1171 if ((tdep->xcr0 & X86_XSTATE_PKRU))
1172 {
1173 if ((clear_bv & X86_XSTATE_PKRU))
1174 {
1175 for (i = I387_PKRU_REGNUM (tdep);
1176 i < I387_PKEYSEND_REGNUM (tdep);
1177 i++)
39d45a70 1178 regcache->raw_supply_zeroed (i);
51547df6
MS
1179 }
1180 else
1181 {
1182 for (i = I387_PKRU_REGNUM (tdep);
1183 i < I387_PKEYSEND_REGNUM (tdep);
1184 i++)
73e1c03f 1185 regcache->raw_supply (i, XSAVE_PKEYS_ADDR (tdep, regs, i));
51547df6
MS
1186 }
1187 }
1188
b5420128
JB
1189 /* Handle the upper halves of the low 8/16 ZMM registers. */
1190 if ((tdep->xcr0 & X86_XSTATE_ZMM_H))
01f9f808 1191 {
b5420128 1192 if ((clear_bv & X86_XSTATE_ZMM_H))
01f9f808 1193 {
b5420128 1194 for (i = I387_ZMM0H_REGNUM (tdep); i < zmm_endlo_regnum; i++)
39d45a70 1195 regcache->raw_supply_zeroed (i);
01f9f808
MS
1196 }
1197 else
1198 {
b5420128 1199 for (i = I387_ZMM0H_REGNUM (tdep); i < zmm_endlo_regnum; i++)
73e1c03f 1200 regcache->raw_supply (i,
8938f531 1201 XSAVE_AVX512_ZMM0_H_ADDR (tdep, regs, i));
01f9f808
MS
1202 }
1203 }
1204
1205 /* Handle AVX512 OpMask registers. */
df7e5265 1206 if ((tdep->xcr0 & X86_XSTATE_K))
01f9f808 1207 {
df7e5265 1208 if ((clear_bv & X86_XSTATE_K))
01f9f808
MS
1209 {
1210 for (i = I387_K0_REGNUM (tdep);
1211 i < I387_KEND_REGNUM (tdep);
1212 i++)
39d45a70 1213 regcache->raw_supply_zeroed (i);
01f9f808
MS
1214 }
1215 else
1216 {
1217 for (i = I387_K0_REGNUM (tdep);
1218 i < I387_KEND_REGNUM (tdep);
1219 i++)
73e1c03f 1220 regcache->raw_supply (i, XSAVE_AVX512_K_ADDR (tdep, regs, i));
01f9f808
MS
1221 }
1222 }
1223
b5420128 1224 /* Handle the upper 16 ZMM/YMM/XMM registers (if any). */
df7e5265 1225 if ((tdep->xcr0 & X86_XSTATE_ZMM))
01f9f808 1226 {
df7e5265 1227 if ((clear_bv & X86_XSTATE_ZMM))
01f9f808 1228 {
8938f531
JB
1229 for (i = I387_ZMM16H_REGNUM (tdep);
1230 i < I387_ZMMENDH_REGNUM (tdep); i++)
39d45a70 1231 regcache->raw_supply_zeroed (i);
01f9f808
MS
1232 for (i = I387_YMM16H_REGNUM (tdep);
1233 i < I387_YMMH_AVX512_END_REGNUM (tdep);
1234 i++)
39d45a70 1235 regcache->raw_supply_zeroed (i);
01f9f808
MS
1236 for (i = I387_XMM16_REGNUM (tdep);
1237 i < I387_XMM_AVX512_END_REGNUM (tdep);
1238 i++)
39d45a70 1239 regcache->raw_supply_zeroed (i);
01f9f808
MS
1240 }
1241 else
1242 {
8938f531
JB
1243 for (i = I387_ZMM16H_REGNUM (tdep);
1244 i < I387_ZMMENDH_REGNUM (tdep); i++)
b5420128 1245 regcache->raw_supply (i,
8938f531 1246 XSAVE_AVX512_ZMM16_H_ADDR (tdep, regs, i));
01f9f808
MS
1247 for (i = I387_YMM16H_REGNUM (tdep);
1248 i < I387_YMMH_AVX512_END_REGNUM (tdep);
1249 i++)
c7e4521c
FW
1250 regcache->raw_supply (i,
1251 XSAVE_YMM_H_AVX512_ADDR (tdep, regs, i));
01f9f808
MS
1252 for (i = I387_XMM16_REGNUM (tdep);
1253 i < I387_XMM_AVX512_END_REGNUM (tdep);
1254 i++)
73e1c03f 1255 regcache->raw_supply (i, XSAVE_XMM_AVX512_ADDR (tdep, regs, i));
01f9f808
MS
1256 }
1257 }
86d31898 1258 /* Handle the upper YMM registers. */
df7e5265 1259 if ((tdep->xcr0 & X86_XSTATE_AVX))
31aeac78 1260 {
df7e5265 1261 if ((clear_bv & X86_XSTATE_AVX))
b4d36fb8
PA
1262 {
1263 for (i = I387_YMM0H_REGNUM (tdep);
1264 i < I387_YMMENDH_REGNUM (tdep);
1265 i++)
39d45a70 1266 regcache->raw_supply_zeroed (i);
b4d36fb8 1267 }
31aeac78 1268 else
31aeac78 1269 {
b4d36fb8
PA
1270 for (i = I387_YMM0H_REGNUM (tdep);
1271 i < I387_YMMENDH_REGNUM (tdep);
1272 i++)
73e1c03f 1273 regcache->raw_supply (i, XSAVE_AVXH_ADDR (tdep, regs, i));
31aeac78
L
1274 }
1275 }
1276
1277 /* Handle the XMM registers. */
df7e5265 1278 if ((tdep->xcr0 & X86_XSTATE_SSE))
31aeac78 1279 {
df7e5265 1280 if ((clear_bv & X86_XSTATE_SSE))
b4d36fb8
PA
1281 {
1282 for (i = I387_XMM0_REGNUM (tdep);
1283 i < I387_MXCSR_REGNUM (tdep);
1284 i++)
39d45a70 1285 regcache->raw_supply_zeroed (i);
b4d36fb8 1286 }
31aeac78 1287 else
31aeac78 1288 {
b4d36fb8
PA
1289 for (i = I387_XMM0_REGNUM (tdep);
1290 i < I387_MXCSR_REGNUM (tdep); i++)
73e1c03f 1291 regcache->raw_supply (i, FXSAVE_ADDR (tdep, regs, i));
31aeac78
L
1292 }
1293 }
1294
1295 /* Handle the x87 registers. */
df7e5265 1296 if ((tdep->xcr0 & X86_XSTATE_X87))
31aeac78 1297 {
df7e5265 1298 if ((clear_bv & X86_XSTATE_X87))
b4d36fb8
PA
1299 {
1300 for (i = I387_ST0_REGNUM (tdep);
1301 i < I387_FCTRL_REGNUM (tdep);
1302 i++)
39d45a70 1303 regcache->raw_supply_zeroed (i);
b4d36fb8 1304 }
31aeac78 1305 else
31aeac78 1306 {
b4d36fb8
PA
1307 for (i = I387_ST0_REGNUM (tdep);
1308 i < I387_FCTRL_REGNUM (tdep);
1309 i++)
73e1c03f 1310 regcache->raw_supply (i, FXSAVE_ADDR (tdep, regs, i));
31aeac78
L
1311 }
1312 }
1313 break;
1314 }
1315
1316 /* Only handle x87 control registers. */
1317 for (i = I387_FCTRL_REGNUM (tdep); i < I387_XMM0_REGNUM (tdep); i++)
1318 if (regnum == -1 || regnum == i)
1319 {
8ee22052
AB
1320 if (clear_bv & X86_XSTATE_X87)
1321 {
1322 if (i == I387_FCTRL_REGNUM (tdep))
1323 {
1324 gdb_byte buf[4];
1325
1326 store_unsigned_integer (buf, 4, byte_order,
1327 I387_FCTRL_INIT_VAL);
73e1c03f 1328 regcache->raw_supply (i, buf);
8ee22052
AB
1329 }
1330 else if (i == I387_FTAG_REGNUM (tdep))
1331 {
1332 gdb_byte buf[4];
1333
1334 store_unsigned_integer (buf, 4, byte_order, 0xffff);
73e1c03f 1335 regcache->raw_supply (i, buf);
8ee22052
AB
1336 }
1337 else
39d45a70 1338 regcache->raw_supply_zeroed (i);
8ee22052 1339 }
31aeac78
L
1340 /* Most of the FPU control registers occupy only 16 bits in
1341 the xsave extended state. Give those a special treatment. */
8ee22052
AB
1342 else if (i != I387_FIOFF_REGNUM (tdep)
1343 && i != I387_FOOFF_REGNUM (tdep))
31aeac78
L
1344 {
1345 gdb_byte val[4];
1346
1347 memcpy (val, FXSAVE_ADDR (tdep, regs, i), 2);
1348 val[2] = val[3] = 0;
1349 if (i == I387_FOP_REGNUM (tdep))
1350 val[1] &= ((1 << 3) - 1);
8ee22052 1351 else if (i == I387_FTAG_REGNUM (tdep))
31aeac78
L
1352 {
1353 /* The fxsave area contains a simplified version of
1354 the tag word. We have to look at the actual 80-bit
1355 FP data to recreate the traditional i387 tag word. */
1356
1357 unsigned long ftag = 0;
1358 int fpreg;
1359 int top;
1360
1361 top = ((FXSAVE_ADDR (tdep, regs,
1362 I387_FSTAT_REGNUM (tdep)))[1] >> 3);
1363 top &= 0x7;
1364
1365 for (fpreg = 7; fpreg >= 0; fpreg--)
1366 {
1367 int tag;
1368
1369 if (val[0] & (1 << fpreg))
1370 {
e5b3d7d6 1371 int thisreg = (fpreg + 8 - top) % 8
31aeac78 1372 + I387_ST0_REGNUM (tdep);
e5b3d7d6 1373 tag = i387_tag (FXSAVE_ADDR (tdep, regs, thisreg));
31aeac78
L
1374 }
1375 else
1376 tag = 3; /* Empty */
1377
1378 ftag |= tag << (2 * fpreg);
1379 }
1380 val[0] = ftag & 0xff;
1381 val[1] = (ftag >> 8) & 0xff;
1382 }
73e1c03f 1383 regcache->raw_supply (i, val);
31aeac78 1384 }
8ee22052 1385 else
73e1c03f 1386 regcache->raw_supply (i, FXSAVE_ADDR (tdep, regs, i));
31aeac78
L
1387 }
1388
1389 if (regnum == I387_MXCSR_REGNUM (tdep) || regnum == -1)
8ee22052
AB
1390 {
1391 /* The MXCSR register is placed into the xsave buffer if either the
1392 AVX or SSE features are enabled. */
1393 if ((clear_bv & (X86_XSTATE_AVX | X86_XSTATE_SSE))
1394 == (X86_XSTATE_AVX | X86_XSTATE_SSE))
1395 {
1396 gdb_byte buf[4];
1397
1398 store_unsigned_integer (buf, 4, byte_order, I387_MXCSR_INIT_VAL);
73e1c03f 1399 regcache->raw_supply (I387_MXCSR_REGNUM (tdep), buf);
8ee22052
AB
1400 }
1401 else
73e1c03f
SM
1402 regcache->raw_supply (I387_MXCSR_REGNUM (tdep),
1403 FXSAVE_MXCSR_ADDR (regs));
8ee22052 1404 }
31aeac78
L
1405}
1406
1407/* Similar to i387_collect_fxsave, but use XSAVE extended state. */
1408
1409void
1410i387_collect_xsave (const struct regcache *regcache, int regnum,
1411 void *xsave, int gcore)
1412{
ac7936df 1413 struct gdbarch *gdbarch = regcache->arch ();
8ee22052 1414 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
08106042 1415 i386_gdbarch_tdep *tdep = gdbarch_tdep<i386_gdbarch_tdep> (gdbarch);
8ee22052
AB
1416 gdb_byte *p, *regs = (gdb_byte *) xsave;
1417 gdb_byte raw[I386_MAX_REGISTER_SIZE];
1418 ULONGEST initial_xstate_bv, clear_bv, xstate_bv = 0;
35f1fea3 1419 unsigned int i;
b5420128
JB
1420 /* See the comment in i387_supply_xsave(). */
1421 unsigned int zmm_endlo_regnum = I387_ZMM0H_REGNUM (tdep)
1422 + std::min (tdep->num_zmm_regs, 16);
31aeac78
L
1423 enum
1424 {
8ee22052
AB
1425 x87_ctrl_or_mxcsr = 0x1,
1426 x87 = 0x2,
1427 sse = 0x4,
1428 avxh = 0x8,
fc143432
SC
1429 avx512_k = 0x10,
1430 avx512_zmm0_h = 0x20,
1431 avx512_zmm16_h = 0x40,
1432 avx512_ymmh_avx512 = 0x80,
1433 avx512_xmm_avx512 = 0x100,
1434 pkeys = 0x200,
1435 all = x87 | sse | avxh | avx512_k | avx512_zmm0_h | avx512_zmm16_h
1436 | avx512_ymmh_avx512 | avx512_xmm_avx512 | pkeys
31aeac78
L
1437 } regclass;
1438
1439 gdb_assert (tdep->st0_regnum >= I386_ST0_REGNUM);
1440 gdb_assert (tdep->num_xmm_regs > 0);
1441
1442 if (regnum == -1)
1443 regclass = all;
51547df6
MS
1444 else if (regnum >= I387_PKRU_REGNUM (tdep)
1445 && regnum < I387_PKEYSEND_REGNUM (tdep))
1446 regclass = pkeys;
01f9f808 1447 else if (regnum >= I387_ZMM0H_REGNUM (tdep)
8938f531
JB
1448 && regnum < I387_ZMM16H_REGNUM (tdep))
1449 regclass = avx512_zmm0_h;
1450 else if (regnum >= I387_ZMM16H_REGNUM (tdep)
01f9f808 1451 && regnum < I387_ZMMENDH_REGNUM (tdep))
8938f531 1452 regclass = avx512_zmm16_h;
01f9f808
MS
1453 else if (regnum >= I387_K0_REGNUM (tdep)
1454 && regnum < I387_KEND_REGNUM (tdep))
1455 regclass = avx512_k;
1456 else if (regnum >= I387_YMM16H_REGNUM (tdep)
1457 && regnum < I387_YMMH_AVX512_END_REGNUM (tdep))
1458 regclass = avx512_ymmh_avx512;
1459 else if (regnum >= I387_XMM16_REGNUM (tdep)
1460 && regnum < I387_XMM_AVX512_END_REGNUM (tdep))
1461 regclass = avx512_xmm_avx512;
31aeac78
L
1462 else if (regnum >= I387_YMM0H_REGNUM (tdep)
1463 && regnum < I387_YMMENDH_REGNUM (tdep))
1464 regclass = avxh;
1dbcd68c 1465 else if (regnum >= I387_XMM0_REGNUM (tdep)
31aeac78
L
1466 && regnum < I387_MXCSR_REGNUM (tdep))
1467 regclass = sse;
1468 else if (regnum >= I387_ST0_REGNUM (tdep)
1469 && regnum < I387_FCTRL_REGNUM (tdep))
1470 regclass = x87;
8ee22052
AB
1471 else if ((regnum >= I387_FCTRL_REGNUM (tdep)
1472 && regnum < I387_XMM0_REGNUM (tdep))
1473 || regnum == I387_MXCSR_REGNUM (tdep))
1474 regclass = x87_ctrl_or_mxcsr;
31aeac78 1475 else
f34652de 1476 internal_error (_("invalid i387 regnum %d"), regnum);
31aeac78
L
1477
1478 if (gcore)
1479 {
1480 /* Clear XSAVE extended state. */
8938f531 1481 memset (regs, 0, tdep->xsave_layout.sizeof_xsave);
31aeac78
L
1482
1483 /* Update XCR0 and `xstate_bv' with XCR0 for gcore. */
1484 if (tdep->xsave_xcr0_offset != -1)
1485 memcpy (regs + tdep->xsave_xcr0_offset, &tdep->xcr0, 8);
1486 memcpy (XSAVE_XSTATE_BV_ADDR (regs), &tdep->xcr0, 8);
1487 }
1488
8ee22052
AB
1489 /* The supported bits in `xstat_bv' are 8 bytes. */
1490 initial_xstate_bv = extract_unsigned_integer (XSAVE_XSTATE_BV_ADDR (regs),
1491 8, byte_order);
1492 clear_bv = (~(initial_xstate_bv)) & tdep->xcr0;
1493
1494 /* The XSAVE buffer was filled lazily by the kernel. Only those
1495 features that are enabled were written into the buffer, disabled
1496 features left the buffer uninitialised. In order to identify if any
1497 registers have changed we will be comparing the register cache
1498 version to the version in the XSAVE buffer, it is important then that
1499 at this point we initialise to the default values any features in
1500 XSAVE that are not yet initialised.
1501
1502 This could be made more efficient, we know which features (from
1503 REGNUM) we will be potentially updating, and could limit ourselves to
1504 only clearing that feature. However, the extra complexity does not
1505 seem justified at this point. */
1506 if (clear_bv)
31aeac78 1507 {
8ee22052
AB
1508 if ((clear_bv & X86_XSTATE_PKRU))
1509 for (i = I387_PKRU_REGNUM (tdep);
1510 i < I387_PKEYSEND_REGNUM (tdep); i++)
1511 memset (XSAVE_PKEYS_ADDR (tdep, regs, i), 0, 4);
31aeac78 1512
b5420128
JB
1513 if ((clear_bv & X86_XSTATE_ZMM_H))
1514 for (i = I387_ZMM0H_REGNUM (tdep); i < zmm_endlo_regnum; i++)
8938f531 1515 memset (XSAVE_AVX512_ZMM0_H_ADDR (tdep, regs, i), 0, 32);
1dbcd68c 1516
8ee22052
AB
1517 if ((clear_bv & X86_XSTATE_K))
1518 for (i = I387_K0_REGNUM (tdep);
1519 i < I387_KEND_REGNUM (tdep); i++)
1520 memset (XSAVE_AVX512_K_ADDR (tdep, regs, i), 0, 8);
01f9f808 1521
8ee22052
AB
1522 if ((clear_bv & X86_XSTATE_ZMM))
1523 {
8938f531
JB
1524 for (i = I387_ZMM16H_REGNUM (tdep); i < I387_ZMMENDH_REGNUM (tdep);
1525 i++)
1526 memset (XSAVE_AVX512_ZMM16_H_ADDR (tdep, regs, i), 0, 32);
8ee22052
AB
1527 for (i = I387_YMM16H_REGNUM (tdep);
1528 i < I387_YMMH_AVX512_END_REGNUM (tdep); i++)
c7e4521c 1529 memset (XSAVE_YMM_H_AVX512_ADDR (tdep, regs, i), 0, 16);
8ee22052
AB
1530 for (i = I387_XMM16_REGNUM (tdep);
1531 i < I387_XMM_AVX512_END_REGNUM (tdep); i++)
1532 memset (XSAVE_XMM_AVX512_ADDR (tdep, regs, i), 0, 16);
1533 }
01f9f808 1534
8ee22052
AB
1535 if ((clear_bv & X86_XSTATE_AVX))
1536 for (i = I387_YMM0H_REGNUM (tdep);
1537 i < I387_YMMENDH_REGNUM (tdep); i++)
1538 memset (XSAVE_AVXH_ADDR (tdep, regs, i), 0, 16);
01f9f808 1539
8ee22052
AB
1540 if ((clear_bv & X86_XSTATE_SSE))
1541 for (i = I387_XMM0_REGNUM (tdep);
1542 i < I387_MXCSR_REGNUM (tdep); i++)
1543 memset (FXSAVE_ADDR (tdep, regs, i), 0, 16);
1544
1545 /* The mxcsr register is written into the xsave buffer if either AVX
1546 or SSE is enabled, so only clear it if both of those features
1547 require clearing. */
1548 if ((clear_bv & (X86_XSTATE_AVX | X86_XSTATE_SSE))
1549 == (X86_XSTATE_AVX | X86_XSTATE_SSE))
cf4912ae 1550 store_unsigned_integer (FXSAVE_MXCSR_ADDR (regs), 2, byte_order,
8ee22052 1551 I387_MXCSR_INIT_VAL);
31aeac78 1552
8ee22052
AB
1553 if ((clear_bv & X86_XSTATE_X87))
1554 {
1555 for (i = I387_ST0_REGNUM (tdep);
1556 i < I387_FCTRL_REGNUM (tdep); i++)
1557 memset (FXSAVE_ADDR (tdep, regs, i), 0, 10);
31aeac78 1558
8ee22052
AB
1559 for (i = I387_FCTRL_REGNUM (tdep);
1560 i < I387_XMM0_REGNUM (tdep); i++)
1561 {
1562 if (i == I387_FCTRL_REGNUM (tdep))
1563 store_unsigned_integer (FXSAVE_ADDR (tdep, regs, i), 2,
1564 byte_order, I387_FCTRL_INIT_VAL);
1565 else
1566 memset (FXSAVE_ADDR (tdep, regs, i), 0,
d7070173 1567 regcache->register_size (i));
8ee22052 1568 }
31aeac78 1569 }
8ee22052 1570 }
31aeac78 1571
8ee22052
AB
1572 if (regclass == all)
1573 {
1574 /* Check if any PKEYS registers are changed. */
1575 if ((tdep->xcr0 & X86_XSTATE_PKRU))
1576 for (i = I387_PKRU_REGNUM (tdep);
1577 i < I387_PKEYSEND_REGNUM (tdep); i++)
1578 {
34a79281 1579 regcache->raw_collect (i, raw);
8ee22052
AB
1580 p = XSAVE_PKEYS_ADDR (tdep, regs, i);
1581 if (memcmp (raw, p, 4) != 0)
51547df6 1582 {
8ee22052
AB
1583 xstate_bv |= X86_XSTATE_PKRU;
1584 memcpy (p, raw, 4);
51547df6 1585 }
8ee22052 1586 }
51547df6 1587
8ee22052 1588 /* Check if any ZMMH registers are changed. */
8938f531
JB
1589 if ((tdep->xcr0 & X86_XSTATE_ZMM))
1590 for (i = I387_ZMM16H_REGNUM (tdep);
8ee22052
AB
1591 i < I387_ZMMENDH_REGNUM (tdep); i++)
1592 {
34a79281 1593 regcache->raw_collect (i, raw);
8938f531 1594 p = XSAVE_AVX512_ZMM16_H_ADDR (tdep, regs, i);
8ee22052 1595 if (memcmp (raw, p, 32) != 0)
01f9f808 1596 {
8938f531
JB
1597 xstate_bv |= X86_XSTATE_ZMM;
1598 memcpy (p, raw, 32);
1599 }
1600 }
1601
1602 if ((tdep->xcr0 & X86_XSTATE_ZMM_H))
1603 for (i = I387_ZMM0H_REGNUM (tdep); i < zmm_endlo_regnum; i++)
1604 {
1605 regcache->raw_collect (i, raw);
1606 p = XSAVE_AVX512_ZMM0_H_ADDR (tdep, regs, i);
1607 if (memcmp (raw, p, 32) != 0)
1608 {
1609 xstate_bv |= X86_XSTATE_ZMM_H;
8ee22052 1610 memcpy (p, raw, 32);
01f9f808 1611 }
8ee22052 1612 }
01f9f808 1613
8ee22052
AB
1614 /* Check if any K registers are changed. */
1615 if ((tdep->xcr0 & X86_XSTATE_K))
1616 for (i = I387_K0_REGNUM (tdep);
1617 i < I387_KEND_REGNUM (tdep); i++)
1618 {
34a79281 1619 regcache->raw_collect (i, raw);
8ee22052
AB
1620 p = XSAVE_AVX512_K_ADDR (tdep, regs, i);
1621 if (memcmp (raw, p, 8) != 0)
01f9f808 1622 {
8ee22052
AB
1623 xstate_bv |= X86_XSTATE_K;
1624 memcpy (p, raw, 8);
01f9f808 1625 }
8ee22052 1626 }
01f9f808 1627
8ee22052
AB
1628 /* Check if any XMM or upper YMM registers are changed. */
1629 if ((tdep->xcr0 & X86_XSTATE_ZMM))
1630 {
1631 for (i = I387_YMM16H_REGNUM (tdep);
1632 i < I387_YMMH_AVX512_END_REGNUM (tdep); i++)
01f9f808 1633 {
34a79281 1634 regcache->raw_collect (i, raw);
c7e4521c 1635 p = XSAVE_YMM_H_AVX512_ADDR (tdep, regs, i);
8ee22052 1636 if (memcmp (raw, p, 16) != 0)
01f9f808 1637 {
8ee22052
AB
1638 xstate_bv |= X86_XSTATE_ZMM;
1639 memcpy (p, raw, 16);
01f9f808 1640 }
8ee22052
AB
1641 }
1642 for (i = I387_XMM16_REGNUM (tdep);
1643 i < I387_XMM_AVX512_END_REGNUM (tdep); i++)
1644 {
34a79281 1645 regcache->raw_collect (i, raw);
8ee22052
AB
1646 p = XSAVE_XMM_AVX512_ADDR (tdep, regs, i);
1647 if (memcmp (raw, p, 16) != 0)
01f9f808 1648 {
8ee22052
AB
1649 xstate_bv |= X86_XSTATE_ZMM;
1650 memcpy (p, raw, 16);
01f9f808
MS
1651 }
1652 }
8ee22052 1653 }
01f9f808 1654
8ee22052
AB
1655 /* Check if any upper YMM registers are changed. */
1656 if ((tdep->xcr0 & X86_XSTATE_AVX))
1657 for (i = I387_YMM0H_REGNUM (tdep);
1658 i < I387_YMMENDH_REGNUM (tdep); i++)
1659 {
34a79281 1660 regcache->raw_collect (i, raw);
8ee22052
AB
1661 p = XSAVE_AVXH_ADDR (tdep, regs, i);
1662 if (memcmp (raw, p, 16))
1dbcd68c 1663 {
8ee22052
AB
1664 xstate_bv |= X86_XSTATE_AVX;
1665 memcpy (p, raw, 16);
1dbcd68c 1666 }
8ee22052 1667 }
31aeac78 1668
8ee22052
AB
1669 /* Check if any SSE registers are changed. */
1670 if ((tdep->xcr0 & X86_XSTATE_SSE))
1671 for (i = I387_XMM0_REGNUM (tdep);
1672 i < I387_MXCSR_REGNUM (tdep); i++)
1673 {
34a79281 1674 regcache->raw_collect (i, raw);
8ee22052
AB
1675 p = FXSAVE_ADDR (tdep, regs, i);
1676 if (memcmp (raw, p, 16))
31aeac78 1677 {
8ee22052
AB
1678 xstate_bv |= X86_XSTATE_SSE;
1679 memcpy (p, raw, 16);
31aeac78 1680 }
8ee22052 1681 }
31aeac78 1682
8ee22052
AB
1683 if ((tdep->xcr0 & X86_XSTATE_AVX) || (tdep->xcr0 & X86_XSTATE_SSE))
1684 {
1685 i = I387_MXCSR_REGNUM (tdep);
34a79281 1686 regcache->raw_collect (i, raw);
cf4912ae 1687 p = FXSAVE_MXCSR_ADDR (regs);
8ee22052
AB
1688 if (memcmp (raw, p, 4))
1689 {
1690 /* Now, we need to mark one of either SSE of AVX as enabled.
1691 We could pick either. What we do is check to see if one
1692 of the features is already enabled, if it is then we leave
1693 it at that, otherwise we pick SSE. */
1694 if ((xstate_bv & (X86_XSTATE_SSE | X86_XSTATE_AVX)) == 0)
1695 xstate_bv |= X86_XSTATE_SSE;
1696 memcpy (p, raw, 4);
1697 }
1698 }
1699
1700 /* Check if any X87 registers are changed. Only the non-control
1701 registers are handled here, the control registers are all handled
1702 later on in this function. */
1703 if ((tdep->xcr0 & X86_XSTATE_X87))
1704 for (i = I387_ST0_REGNUM (tdep);
1705 i < I387_FCTRL_REGNUM (tdep); i++)
1706 {
34a79281 1707 regcache->raw_collect (i, raw);
8ee22052
AB
1708 p = FXSAVE_ADDR (tdep, regs, i);
1709 if (memcmp (raw, p, 10))
31aeac78 1710 {
8ee22052
AB
1711 xstate_bv |= X86_XSTATE_X87;
1712 memcpy (p, raw, 10);
31aeac78 1713 }
8ee22052
AB
1714 }
1715 }
1716 else
1717 {
1718 /* Check if REGNUM is changed. */
34a79281 1719 regcache->raw_collect (regnum, raw);
31aeac78 1720
8ee22052
AB
1721 switch (regclass)
1722 {
1723 default:
f34652de 1724 internal_error (_("invalid i387 regclass"));
8ee22052
AB
1725
1726 case pkeys:
1727 /* This is a PKEYS register. */
1728 p = XSAVE_PKEYS_ADDR (tdep, regs, regnum);
1729 if (memcmp (raw, p, 4) != 0)
31aeac78 1730 {
8ee22052
AB
1731 xstate_bv |= X86_XSTATE_PKRU;
1732 memcpy (p, raw, 4);
1733 }
1734 break;
01f9f808 1735
8938f531
JB
1736 case avx512_zmm16_h:
1737 /* This is a ZMM16-31 register. */
1738 p = XSAVE_AVX512_ZMM16_H_ADDR (tdep, regs, regnum);
8ee22052
AB
1739 if (memcmp (raw, p, 32) != 0)
1740 {
8938f531 1741 xstate_bv |= X86_XSTATE_ZMM;
8ee22052
AB
1742 memcpy (p, raw, 32);
1743 }
1744 break;
8938f531
JB
1745
1746 case avx512_zmm0_h:
1747 /* This is a ZMM0-15 register. */
1748 p = XSAVE_AVX512_ZMM0_H_ADDR (tdep, regs, regnum);
1749 if (memcmp (raw, p, 32) != 0)
1750 {
1751 xstate_bv |= X86_XSTATE_ZMM_H;
1752 memcpy (p, raw, 32);
1753 }
1754 break;
1755
8ee22052
AB
1756 case avx512_k:
1757 /* This is a AVX512 mask register. */
1758 p = XSAVE_AVX512_K_ADDR (tdep, regs, regnum);
1759 if (memcmp (raw, p, 8) != 0)
1760 {
1761 xstate_bv |= X86_XSTATE_K;
1762 memcpy (p, raw, 8);
1763 }
1764 break;
01f9f808 1765
8ee22052
AB
1766 case avx512_ymmh_avx512:
1767 /* This is an upper YMM16-31 register. */
c7e4521c 1768 p = XSAVE_YMM_H_AVX512_ADDR (tdep, regs, regnum);
8ee22052
AB
1769 if (memcmp (raw, p, 16) != 0)
1770 {
1771 xstate_bv |= X86_XSTATE_ZMM;
1772 memcpy (p, raw, 16);
1773 }
1774 break;
01f9f808 1775
8ee22052
AB
1776 case avx512_xmm_avx512:
1777 /* This is an upper XMM16-31 register. */
1778 p = XSAVE_XMM_AVX512_ADDR (tdep, regs, regnum);
1779 if (memcmp (raw, p, 16) != 0)
1780 {
1781 xstate_bv |= X86_XSTATE_ZMM;
1782 memcpy (p, raw, 16);
1783 }
1784 break;
31aeac78 1785
8ee22052
AB
1786 case avxh:
1787 /* This is an upper YMM register. */
1788 p = XSAVE_AVXH_ADDR (tdep, regs, regnum);
1789 if (memcmp (raw, p, 16))
1790 {
1791 xstate_bv |= X86_XSTATE_AVX;
1792 memcpy (p, raw, 16);
1793 }
1794 break;
1dbcd68c 1795
8ee22052
AB
1796 case sse:
1797 /* This is an SSE register. */
1798 p = FXSAVE_ADDR (tdep, regs, regnum);
1799 if (memcmp (raw, p, 16))
1800 {
1801 xstate_bv |= X86_XSTATE_SSE;
1802 memcpy (p, raw, 16);
31aeac78 1803 }
8ee22052 1804 break;
40936b0d 1805
8ee22052
AB
1806 case x87:
1807 /* This is an x87 register. */
1808 p = FXSAVE_ADDR (tdep, regs, regnum);
1809 if (memcmp (raw, p, 10))
1810 {
1811 xstate_bv |= X86_XSTATE_X87;
1812 memcpy (p, raw, 10);
1813 }
1814 break;
40936b0d 1815
8ee22052
AB
1816 case x87_ctrl_or_mxcsr:
1817 /* We only handle MXCSR here. All other x87 control registers
1818 are handled separately below. */
1819 if (regnum == I387_MXCSR_REGNUM (tdep))
31aeac78 1820 {
8ee22052
AB
1821 p = FXSAVE_MXCSR_ADDR (regs);
1822 if (memcmp (raw, p, 2))
1823 {
1824 /* We're only setting MXCSR, so check the initial state
1825 to see if either of AVX or SSE are already enabled.
1826 If they are then we'll attribute this changed MXCSR to
1827 that feature. If neither feature is enabled, then
1828 we'll attribute this change to the SSE feature. */
1829 xstate_bv |= (initial_xstate_bv
1830 & (X86_XSTATE_AVX | X86_XSTATE_SSE));
1831 if ((xstate_bv & (X86_XSTATE_AVX | X86_XSTATE_SSE)) == 0)
1832 xstate_bv |= X86_XSTATE_SSE;
1833 memcpy (p, raw, 2);
1834 }
31aeac78 1835 }
40936b0d 1836 }
31aeac78
L
1837 }
1838
1839 /* Only handle x87 control registers. */
1840 for (i = I387_FCTRL_REGNUM (tdep); i < I387_XMM0_REGNUM (tdep); i++)
1841 if (regnum == -1 || regnum == i)
1842 {
1843 /* Most of the FPU control registers occupy only 16 bits in
1844 the xsave extended state. Give those a special treatment. */
1845 if (i != I387_FIOFF_REGNUM (tdep)
1846 && i != I387_FOOFF_REGNUM (tdep))
1847 {
1848 gdb_byte buf[4];
1849
34a79281 1850 regcache->raw_collect (i, buf);
31aeac78 1851
20a6ec49 1852 if (i == I387_FOP_REGNUM (tdep))
e750d25e
JT
1853 {
1854 /* The opcode occupies only 11 bits. Make sure we
40936b0d 1855 don't touch the other bits. */
e750d25e 1856 buf[1] &= ((1 << 3) - 1);
20a6ec49 1857 buf[1] |= ((FXSAVE_ADDR (tdep, regs, i))[1] & ~((1 << 3) - 1));
e750d25e 1858 }
20a6ec49 1859 else if (i == I387_FTAG_REGNUM (tdep))
e750d25e
JT
1860 {
1861 /* Converting back is much easier. */
1862
1863 unsigned short ftag;
1864 int fpreg;
1865
1866 ftag = (buf[1] << 8) | buf[0];
1867 buf[0] = 0;
1868 buf[1] = 0;
1869
1870 for (fpreg = 7; fpreg >= 0; fpreg--)
1871 {
1872 int tag = (ftag >> (fpreg * 2)) & 3;
1873
1874 if (tag != 3)
1875 buf[0] |= (1 << fpreg);
1876 }
1877 }
8ee22052
AB
1878 p = FXSAVE_ADDR (tdep, regs, i);
1879 if (memcmp (p, buf, 2))
1880 {
1881 xstate_bv |= X86_XSTATE_X87;
1882 memcpy (p, buf, 2);
1883 }
e750d25e
JT
1884 }
1885 else
8ee22052
AB
1886 {
1887 int regsize;
1888
34a79281 1889 regcache->raw_collect (i, raw);
d7070173 1890 regsize = regcache->register_size (i);
8ee22052
AB
1891 p = FXSAVE_ADDR (tdep, regs, i);
1892 if (memcmp (raw, p, regsize))
1893 {
1894 xstate_bv |= X86_XSTATE_X87;
1895 memcpy (p, raw, regsize);
1896 }
1897 }
e750d25e 1898 }
5716833c 1899
8ee22052
AB
1900 /* Update the corresponding bits in `xstate_bv' if any
1901 registers are changed. */
1902 if (xstate_bv)
1903 {
1904 /* The supported bits in `xstat_bv' are 8 bytes. */
1905 initial_xstate_bv |= xstate_bv;
1906 store_unsigned_integer (XSAVE_XSTATE_BV_ADDR (regs),
1907 8, byte_order,
1908 initial_xstate_bv);
1909 }
e750d25e
JT
1910}
1911
1912/* Recreate the FTW (tag word) valid bits from the 80-bit FP data in
1913 *RAW. */
1914
1915static int
b4ad899f 1916i387_tag (const gdb_byte *raw)
e750d25e
JT
1917{
1918 int integer;
1919 unsigned int exponent;
1920 unsigned long fraction[2];
1921
1922 integer = raw[7] & 0x80;
1923 exponent = (((raw[9] & 0x7f) << 8) | raw[8]);
1924 fraction[0] = ((raw[3] << 24) | (raw[2] << 16) | (raw[1] << 8) | raw[0]);
1925 fraction[1] = (((raw[7] & 0x7f) << 24) | (raw[6] << 16)
1926 | (raw[5] << 8) | raw[4]);
1927
1928 if (exponent == 0x7fff)
1929 {
1930 /* Special. */
1931 return (2);
1932 }
1933 else if (exponent == 0x0000)
1934 {
1935 if (fraction[0] == 0x0000 && fraction[1] == 0x0000 && !integer)
1936 {
1937 /* Zero. */
1938 return (1);
1939 }
1940 else
1941 {
1942 /* Special. */
1943 return (2);
1944 }
1945 }
1946 else
1947 {
1948 if (integer)
1949 {
1950 /* Valid. */
1951 return (0);
1952 }
1953 else
1954 {
1955 /* Special. */
1956 return (2);
1957 }
1958 }
1959}
efb1c01c
MK
1960
1961/* Prepare the FPU stack in REGCACHE for a function return. */
1962
1963void
1964i387_return_value (struct gdbarch *gdbarch, struct regcache *regcache)
1965{
08106042 1966 i386_gdbarch_tdep *tdep = gdbarch_tdep<i386_gdbarch_tdep> (gdbarch);
efb1c01c
MK
1967 ULONGEST fstat;
1968
efb1c01c
MK
1969 /* Set the top of the floating-point register stack to 7. The
1970 actual value doesn't really matter, but 7 is what a normal
1971 function return would end up with if the program started out with
1972 a freshly initialized FPU. */
20a6ec49 1973 regcache_raw_read_unsigned (regcache, I387_FSTAT_REGNUM (tdep), &fstat);
efb1c01c 1974 fstat |= (7 << 11);
20a6ec49 1975 regcache_raw_write_unsigned (regcache, I387_FSTAT_REGNUM (tdep), fstat);
efb1c01c
MK
1976
1977 /* Mark %st(1) through %st(7) as empty. Since we set the top of the
1978 floating-point register stack to 7, the appropriate value for the
1979 tag word is 0x3fff. */
20a6ec49 1980 regcache_raw_write_unsigned (regcache, I387_FTAG_REGNUM (tdep), 0x3fff);
efb1c01c 1981
efb1c01c 1982}