Updated Bulgarian translation for the binutils/ directory
[binutils-gdb.git] / gdb / i387-tdep.c
blob675ee8d2e81eb4d9a451210452a3a65778300853
1 /* Intel 387 floating point stuff.
3 Copyright (C) 1988-2024 Free Software Foundation, Inc.
5 This file is part of GDB.
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
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
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.
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
20 #include "extract-store-integer.h"
21 #include "frame.h"
22 #include "gdbcore.h"
23 #include "inferior.h"
24 #include "language.h"
25 #include "regcache.h"
26 #include "target-float.h"
27 #include "value.h"
29 #include "i386-tdep.h"
30 #include "i387-tdep.h"
31 #include "gdbsupport/x86-xstate.h"
33 /* Print the floating point number specified by RAW. */
35 static void
36 print_i387_value (struct gdbarch *gdbarch,
37 const gdb_byte *raw, struct ui_file *file)
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. */
43 const struct type *type = i387_ext_type (gdbarch);
44 std::string str = target_float_to_string (raw, type, " %-+27.19g");
45 gdb_printf (file, "%s", str.c_str ());
48 /* Print the classification for the register contents RAW. */
50 static void
51 print_i387_ext (struct gdbarch *gdbarch,
52 const gdb_byte *raw, struct ui_file *file)
54 int sign;
55 int integer;
56 unsigned int exponent;
57 unsigned long fraction[2];
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]);
66 if (exponent == 0x7fff && integer)
68 if (fraction[0] == 0x00000000 && fraction[1] == 0x00000000)
69 /* Infinity. */
70 gdb_printf (file, " %cInf", (sign ? '-' : '+'));
71 else if (sign && fraction[0] == 0x00000000 && fraction[1] == 0x40000000)
72 /* Real Indefinite (QNaN). */
73 gdb_puts (" Real Indefinite (QNaN)", file);
74 else if (fraction[1] & 0x40000000)
75 /* QNaN. */
76 gdb_puts (" QNaN", file);
77 else
78 /* SNaN. */
79 gdb_puts (" SNaN", file);
81 else if (exponent < 0x7fff && exponent > 0x0000 && integer)
82 /* Normal. */
83 print_i387_value (gdbarch, raw, file);
84 else if (exponent == 0x0000)
86 /* Denormal or zero. */
87 print_i387_value (gdbarch, raw, file);
89 if (integer)
90 /* Pseudo-denormal. */
91 gdb_puts (" Pseudo-denormal", file);
92 else if (fraction[0] || fraction[1])
93 /* Denormal. */
94 gdb_puts (" Denormal", file);
96 else
97 /* Unsupported. */
98 gdb_puts (" Unsupported", file);
101 /* Print the status word STATUS. If STATUS_P is false, then STATUS
102 was unavailable. */
104 static void
105 print_i387_status_word (int status_p,
106 unsigned int status, struct ui_file *file)
108 gdb_printf (file, "Status Word: ");
109 if (!status_p)
111 gdb_printf (file, "%s\n", _("<unavailable>"));
112 return;
115 gdb_printf (file, "%s", hex_string_custom (status, 4));
116 gdb_puts (" ", file);
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" : " ");
123 gdb_puts (" ", file);
124 gdb_printf (file, " %s", (status & 0x0080) ? "ES" : " ");
125 gdb_puts (" ", file);
126 gdb_printf (file, " %s", (status & 0x0040) ? "SF" : " ");
127 gdb_puts (" ", file);
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" : " ");
133 gdb_puts ("\n", file);
135 gdb_printf (file,
136 " TOP: %d\n", ((status >> 11) & 7));
139 /* Print the control word CONTROL. If CONTROL_P is false, then
140 CONTROL was unavailable. */
142 static void
143 print_i387_control_word (int control_p,
144 unsigned int control, struct ui_file *file)
146 gdb_printf (file, "Control Word: ");
147 if (!control_p)
149 gdb_printf (file, "%s\n", _("<unavailable>"));
150 return;
153 gdb_printf (file, "%s", hex_string_custom (control, 4));
154 gdb_puts (" ", file);
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" : " ");
162 gdb_puts ("\n", file);
164 gdb_puts (" PC: ", file);
165 switch ((control >> 8) & 3)
167 case 0:
168 gdb_puts ("Single Precision (24-bits)\n", file);
169 break;
170 case 1:
171 gdb_puts ("Reserved\n", file);
172 break;
173 case 2:
174 gdb_puts ("Double Precision (53-bits)\n", file);
175 break;
176 case 3:
177 gdb_puts ("Extended Precision (64-bits)\n", file);
178 break;
181 gdb_puts (" RC: ", file);
182 switch ((control >> 10) & 3)
184 case 0:
185 gdb_puts ("Round to nearest\n", file);
186 break;
187 case 1:
188 gdb_puts ("Round down\n", file);
189 break;
190 case 2:
191 gdb_puts ("Round up\n", file);
192 break;
193 case 3:
194 gdb_puts ("Round toward zero\n", file);
195 break;
199 /* Print out the i387 floating point state. Note that we ignore FRAME
200 in the code below. That's OK since floating-point registers are
201 never saved on the stack. */
203 void
204 i387_print_float_info (struct gdbarch *gdbarch, struct ui_file *file,
205 const frame_info_ptr &frame, const char *args)
207 i386_gdbarch_tdep *tdep = gdbarch_tdep<i386_gdbarch_tdep> (gdbarch);
208 ULONGEST fctrl;
209 int fctrl_p;
210 ULONGEST fstat;
211 int fstat_p;
212 ULONGEST ftag;
213 int ftag_p;
214 ULONGEST fiseg;
215 int fiseg_p;
216 ULONGEST fioff;
217 int fioff_p;
218 ULONGEST foseg;
219 int foseg_p;
220 ULONGEST fooff;
221 int fooff_p;
222 ULONGEST fop;
223 int fop_p;
224 int fpreg;
225 int top;
227 gdb_assert (gdbarch == get_frame_arch (frame));
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);
246 if (fstat_p)
248 top = ((fstat >> 11) & 7);
250 for (fpreg = 7; fpreg >= 0; fpreg--)
252 struct value *regval;
253 int regnum;
254 int i;
255 int tag = -1;
257 gdb_printf (file, "%sR%d: ", fpreg == top ? "=>" : " ", fpreg);
259 if (ftag_p)
261 tag = (ftag >> (fpreg * 2)) & 3;
263 switch (tag)
265 case 0:
266 gdb_puts ("Valid ", file);
267 break;
268 case 1:
269 gdb_puts ("Zero ", file);
270 break;
271 case 2:
272 gdb_puts ("Special ", file);
273 break;
274 case 3:
275 gdb_puts ("Empty ", file);
276 break;
279 else
280 gdb_puts ("Unknown ", file);
282 regnum = (fpreg + 8 - top) % 8 + I387_ST0_REGNUM (tdep);
283 regval = get_frame_register_value (frame, regnum);
285 if (regval->entirely_available ())
287 const gdb_byte *raw = regval->contents ().data ();
289 gdb_puts ("0x", file);
290 for (i = 9; i >= 0; i--)
291 gdb_printf (file, "%02x", raw[i]);
293 if (tag != -1 && tag != 3)
294 print_i387_ext (gdbarch, raw, file);
296 else
297 gdb_printf (file, "%s", _("<unavailable>"));
299 gdb_puts ("\n", file);
303 gdb_puts ("\n", file);
304 print_i387_status_word (fstat_p, fstat, file);
305 print_i387_control_word (fctrl_p, fctrl, file);
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>"));
323 /* Return nonzero if a value of type TYPE stored in register REGNUM
324 needs any special handling. */
327 i387_convert_register_p (struct gdbarch *gdbarch, int regnum,
328 struct type *type)
330 if (i386_fp_regnum_p (gdbarch, regnum))
332 /* Floating point registers must be converted unless we are
333 accessing them in their hardware type or TYPE is not float. */
334 if (type == i387_ext_type (gdbarch)
335 || type->code () != TYPE_CODE_FLT)
336 return 0;
337 else
338 return 1;
341 return 0;
344 /* Read a value of type TYPE from register REGNUM in frame FRAME, and
345 return its contents in TO. */
348 i387_register_to_value (const frame_info_ptr &frame, int regnum,
349 struct type *type, gdb_byte *to,
350 int *optimizedp, int *unavailablep)
352 struct gdbarch *gdbarch = get_frame_arch (frame);
353 gdb_byte from[I386_MAX_REGISTER_SIZE];
355 gdb_assert (i386_fp_regnum_p (gdbarch, regnum));
357 /* We only support floating-point values. */
358 if (type->code () != TYPE_CODE_FLT)
360 warning (_("Cannot convert floating-point register value "
361 "to non-floating-point type."));
362 *optimizedp = *unavailablep = 0;
363 return 0;
366 /* Convert to TYPE. */
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))
372 return 0;
374 target_float_convert (from, i387_ext_type (gdbarch), to, type);
375 *optimizedp = *unavailablep = 0;
376 return 1;
379 /* Write the contents FROM of a value of type TYPE into register
380 REGNUM in frame FRAME. */
382 void
383 i387_value_to_register (const frame_info_ptr &frame, int regnum,
384 struct type *type, const gdb_byte *from)
386 struct gdbarch *gdbarch = get_frame_arch (frame);
387 gdb_byte to[I386_MAX_REGISTER_SIZE];
389 gdb_assert (i386_fp_regnum_p (gdbarch, regnum));
391 /* We only support floating-point values. */
392 if (type->code () != TYPE_CODE_FLT)
394 warning (_("Cannot convert non-floating-point type "
395 "to floating-point register value."));
396 return;
399 /* Convert from TYPE. */
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 ());
403 put_frame_register (get_next_frame_sentinel_okay (frame), regnum, to_view);
407 /* Handle FSAVE and FXSAVE formats. */
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. */
413 static int fsave_offset[] =
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). */
433 #define FSAVE_ADDR(tdep, fsave, regnum) \
434 (fsave + fsave_offset[regnum - I387_ST0_REGNUM (tdep)])
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. */
441 void
442 i387_supply_fsave (struct regcache *regcache, int regnum, const void *fsave)
444 struct gdbarch *gdbarch = regcache->arch ();
445 i386_gdbarch_tdep *tdep = gdbarch_tdep<i386_gdbarch_tdep> (gdbarch);
446 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
447 const gdb_byte *regs = (const gdb_byte *) fsave;
448 int i;
450 gdb_assert (tdep->st0_regnum >= I386_ST0_REGNUM);
452 for (i = I387_ST0_REGNUM (tdep); i < I387_XMM0_REGNUM (tdep); i++)
453 if (regnum == -1 || regnum == i)
455 if (fsave == NULL)
457 regcache->raw_supply (i, NULL);
458 continue;
461 /* Most of the FPU control registers occupy only 16 bits in the
462 fsave area. Give those a special treatment. */
463 if (i >= I387_FCTRL_REGNUM (tdep)
464 && i != I387_FIOFF_REGNUM (tdep) && i != I387_FOOFF_REGNUM (tdep))
466 gdb_byte val[4];
468 memcpy (val, FSAVE_ADDR (tdep, regs, i), 2);
469 val[2] = val[3] = 0;
470 if (i == I387_FOP_REGNUM (tdep))
471 val[1] &= ((1 << 3) - 1);
472 regcache->raw_supply (i, val);
474 else
475 regcache->raw_supply (i, FSAVE_ADDR (tdep, regs, i));
478 /* Provide dummy values for the SSE registers. */
479 for (i = I387_XMM0_REGNUM (tdep); i < I387_MXCSR_REGNUM (tdep); i++)
480 if (regnum == -1 || regnum == i)
481 regcache->raw_supply (i, NULL);
482 if (regnum == -1 || regnum == I387_MXCSR_REGNUM (tdep))
484 gdb_byte buf[4];
486 store_unsigned_integer (buf, 4, byte_order, I387_MXCSR_INIT_VAL);
487 regcache->raw_supply (I387_MXCSR_REGNUM (tdep), buf);
491 /* Fill register REGNUM (if it is a floating-point register) in *FSAVE
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. */
496 void
497 i387_collect_fsave (const struct regcache *regcache, int regnum, void *fsave)
499 gdbarch *arch = regcache->arch ();
500 i386_gdbarch_tdep *tdep = gdbarch_tdep<i386_gdbarch_tdep> (arch);
501 gdb_byte *regs = (gdb_byte *) fsave;
502 int i;
504 gdb_assert (tdep->st0_regnum >= I386_ST0_REGNUM);
506 for (i = I387_ST0_REGNUM (tdep); i < I387_XMM0_REGNUM (tdep); i++)
507 if (regnum == -1 || regnum == i)
509 /* Most of the FPU control registers occupy only 16 bits in
510 the fsave area. Give those a special treatment. */
511 if (i >= I387_FCTRL_REGNUM (tdep)
512 && i != I387_FIOFF_REGNUM (tdep) && i != I387_FOOFF_REGNUM (tdep))
514 gdb_byte buf[4];
516 regcache->raw_collect (i, buf);
518 if (i == I387_FOP_REGNUM (tdep))
520 /* The opcode occupies only 11 bits. Make sure we
521 don't touch the other bits. */
522 buf[1] &= ((1 << 3) - 1);
523 buf[1] |= ((FSAVE_ADDR (tdep, regs, i))[1] & ~((1 << 3) - 1));
525 memcpy (FSAVE_ADDR (tdep, regs, i), buf, 2);
527 else
528 regcache->raw_collect (i, FSAVE_ADDR (tdep, regs, i));
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. */
537 static int fxsave_offset[] =
539 32, /* %st(0) through ... */
544 112,
545 128,
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 ... */
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,
570 160 + 15 * 16, /* ... %xmm15 (128 bits each). */
573 #define FXSAVE_ADDR(tdep, fxsave, regnum) \
574 (fxsave + fxsave_offset[regnum - I387_ST0_REGNUM (tdep)])
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. */
581 #define FXSAVE_MXCSR_ADDR(fxsave) (fxsave + 24)
583 static int i387_tag (const gdb_byte *raw);
586 /* Fill register REGNUM in REGCACHE with the appropriate
587 floating-point or SSE register value from *FXSAVE. This function
588 masks off any of the reserved bits in *FXSAVE. */
590 void
591 i387_supply_fxsave (struct regcache *regcache, int regnum, const void *fxsave)
593 gdbarch *arch = regcache->arch ();
594 i386_gdbarch_tdep *tdep = gdbarch_tdep<i386_gdbarch_tdep> (arch);
595 const gdb_byte *regs = (const gdb_byte *) fxsave;
596 int i;
598 gdb_assert (tdep->st0_regnum >= I386_ST0_REGNUM);
599 gdb_assert (tdep->num_xmm_regs > 0);
601 for (i = I387_ST0_REGNUM (tdep); i < I387_MXCSR_REGNUM (tdep); i++)
602 if (regnum == -1 || regnum == i)
604 if (regs == NULL)
606 regcache->raw_supply (i, NULL);
607 continue;
610 /* Most of the FPU control registers occupy only 16 bits in
611 the fxsave area. Give those a special treatment. */
612 if (i >= I387_FCTRL_REGNUM (tdep) && i < I387_XMM0_REGNUM (tdep)
613 && i != I387_FIOFF_REGNUM (tdep) && i != I387_FOOFF_REGNUM (tdep))
615 gdb_byte val[4];
617 memcpy (val, FXSAVE_ADDR (tdep, regs, i), 2);
618 val[2] = val[3] = 0;
619 if (i == I387_FOP_REGNUM (tdep))
620 val[1] &= ((1 << 3) - 1);
621 else if (i== I387_FTAG_REGNUM (tdep))
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. */
627 unsigned long ftag = 0;
628 int fpreg;
629 int top;
631 top = ((FXSAVE_ADDR (tdep, regs,
632 I387_FSTAT_REGNUM (tdep)))[1] >> 3);
633 top &= 0x7;
635 for (fpreg = 7; fpreg >= 0; fpreg--)
637 int tag;
639 if (val[0] & (1 << fpreg))
641 int thisreg = (fpreg + 8 - top) % 8
642 + I387_ST0_REGNUM (tdep);
643 tag = i387_tag (FXSAVE_ADDR (tdep, regs, thisreg));
645 else
646 tag = 3; /* Empty */
648 ftag |= tag << (2 * fpreg);
650 val[0] = ftag & 0xff;
651 val[1] = (ftag >> 8) & 0xff;
653 regcache->raw_supply (i, val);
655 else
656 regcache->raw_supply (i, FXSAVE_ADDR (tdep, regs, i));
659 if (regnum == I387_MXCSR_REGNUM (tdep) || regnum == -1)
661 if (regs == NULL)
662 regcache->raw_supply (I387_MXCSR_REGNUM (tdep), NULL);
663 else
664 regcache->raw_supply (I387_MXCSR_REGNUM (tdep),
665 FXSAVE_MXCSR_ADDR (regs));
669 /* Fill register REGNUM (if it is a floating-point or SSE register) in
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. */
674 void
675 i387_collect_fxsave (const struct regcache *regcache, int regnum, void *fxsave)
677 gdbarch *arch = regcache->arch ();
678 i386_gdbarch_tdep *tdep = gdbarch_tdep<i386_gdbarch_tdep> (arch);
679 gdb_byte *regs = (gdb_byte *) fxsave;
680 int i;
682 gdb_assert (tdep->st0_regnum >= I386_ST0_REGNUM);
683 gdb_assert (tdep->num_xmm_regs > 0);
685 for (i = I387_ST0_REGNUM (tdep); i < I387_MXCSR_REGNUM (tdep); i++)
686 if (regnum == -1 || regnum == i)
688 /* Most of the FPU control registers occupy only 16 bits in
689 the fxsave area. Give those a special treatment. */
690 if (i >= I387_FCTRL_REGNUM (tdep) && i < I387_XMM0_REGNUM (tdep)
691 && i != I387_FIOFF_REGNUM (tdep) && i != I387_FOOFF_REGNUM (tdep))
693 gdb_byte buf[4];
695 regcache->raw_collect (i, buf);
697 if (i == I387_FOP_REGNUM (tdep))
699 /* The opcode occupies only 11 bits. Make sure we
700 don't touch the other bits. */
701 buf[1] &= ((1 << 3) - 1);
702 buf[1] |= ((FXSAVE_ADDR (tdep, regs, i))[1] & ~((1 << 3) - 1));
704 else if (i == I387_FTAG_REGNUM (tdep))
706 /* Converting back is much easier. */
708 unsigned short ftag;
709 int fpreg;
711 ftag = (buf[1] << 8) | buf[0];
712 buf[0] = 0;
713 buf[1] = 0;
715 for (fpreg = 7; fpreg >= 0; fpreg--)
717 int tag = (ftag >> (fpreg * 2)) & 3;
719 if (tag != 3)
720 buf[0] |= (1 << fpreg);
723 memcpy (FXSAVE_ADDR (tdep, regs, i), buf, 2);
725 else
726 regcache->raw_collect (i, FXSAVE_ADDR (tdep, regs, i));
729 if (regnum == I387_MXCSR_REGNUM (tdep) || regnum == -1)
730 regcache->raw_collect (I387_MXCSR_REGNUM (tdep),
731 FXSAVE_MXCSR_ADDR (regs));
734 /* `xstate_bv' is at byte offset 512. */
735 #define XSAVE_XSTATE_BV_ADDR(xsave) (xsave + 512)
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. */
741 static int xsave_avxh_offset[] =
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). */
761 #define XSAVE_AVXH_ADDR(tdep, xsave, regnum) \
762 (xsave + (tdep)->xsave_layout.avx_offset \
763 + xsave_avxh_offset[regnum - I387_YMM0H_REGNUM (tdep)])
765 /* At xsave_ymm_h_avx512_offset[REGNUM] you'll find the relative offset
766 within the ZMM region of the XSAVE extended state where the second
767 128bits of GDB register YMM16 + REGNUM is stored. */
769 static int xsave_ymm_h_avx512_offset[] =
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). */
789 #define XSAVE_YMM_H_AVX512_ADDR(tdep, xsave, regnum) \
790 (xsave + (tdep)->xsave_layout.zmm_offset \
791 + xsave_ymm_h_avx512_offset[regnum - I387_YMM16H_REGNUM (tdep)])
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. */
797 static int xsave_xmm_avx512_offset[] =
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). */
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)])
821 /* At xsave_bndregs_offset[REGNUM] you'll find the relative offset
822 within the BNDREGS region of the XSAVE extended state where the GDB
823 register BND0R + REGNUM is stored. */
825 static int xsave_bndregs_offset[] = {
826 0 * 16, /* bnd0r...bnd3r registers. */
827 1 * 16,
828 2 * 16,
829 3 * 16
832 #define XSAVE_BNDREGS_ADDR(tdep, xsave, regnum) \
833 (xsave + (tdep)->xsave_layout.bndregs_offset \
834 + xsave_bndregs_offset[regnum - I387_BND0R_REGNUM (tdep)])
836 static int xsave_bndcfg_offset[] = {
837 0 * 8, /* bndcfg ... bndstatus. */
838 1 * 8,
841 #define XSAVE_BNDCFG_ADDR(tdep, xsave, regnum) \
842 (xsave + (tdep)->xsave_layout.bndcfg_offset \
843 + xsave_bndcfg_offset[regnum - I387_BNDCFGU_REGNUM (tdep)])
845 /* At xsave_avx512_k_offset[REGNUM] you'll find the relative offset
846 within the K region of the XSAVE extended state where the AVX512
847 opmask register K0 + REGNUM is stored. */
849 static int xsave_avx512_k_offset[] =
851 0 * 8, /* %k0 through... */
852 1 * 8,
853 2 * 8,
854 3 * 8,
855 4 * 8,
856 5 * 8,
857 6 * 8,
858 7 * 8 /* %k7 (64 bits each). */
861 #define XSAVE_AVX512_K_ADDR(tdep, xsave, regnum) \
862 (xsave + (tdep)->xsave_layout.k_offset \
863 + xsave_avx512_k_offset[regnum - I387_K0_REGNUM (tdep)])
866 /* At xsave_avx512_zmm0_h_offset[REGNUM] you find the relative offset
867 within the ZMM_H region of the XSAVE extended state where the upper
868 256bits of the GDB register ZMM0 + REGNUM is stored. */
870 static int xsave_avx512_zmm0_h_offset[] =
872 0 * 32, /* Upper 256bit of %zmmh0 through... */
873 1 * 32,
874 2 * 32,
875 3 * 32,
876 4 * 32,
877 5 * 32,
878 6 * 32,
879 7 * 32,
880 8 * 32,
881 9 * 32,
882 10 * 32,
883 11 * 32,
884 12 * 32,
885 13 * 32,
886 14 * 32,
887 15 * 32 /* Upper 256bit of... %zmmh15 (256 bits each). */
890 #define XSAVE_AVX512_ZMM0_H_ADDR(tdep, xsave, regnum) \
891 (xsave + (tdep)->xsave_layout.zmm_h_offset \
892 + xsave_avx512_zmm0_h_offset[regnum - I387_ZMM0H_REGNUM (tdep)])
894 /* At xsave_avx512_zmm16_h_offset[REGNUM] you find the relative offset
895 within the ZMM_H region of the XSAVE extended state where the upper
896 256bits of the GDB register ZMM16 + REGNUM is stored. */
898 static int xsave_avx512_zmm16_h_offset[] =
900 32 + 0 * 64, /* Upper 256bit of... %zmmh16 (256 bits each). */
901 32 + 1 * 64,
902 32 + 2 * 64,
903 32 + 3 * 64,
904 32 + 4 * 64,
905 32 + 5 * 64,
906 32 + 6 * 64,
907 32 + 7 * 64,
908 32 + 8 * 64,
909 32 + 9 * 64,
910 32 + 10 * 64,
911 32 + 11 * 64,
912 32 + 12 * 64,
913 32 + 13 * 64,
914 32 + 14 * 64,
915 32 + 15 * 64 /* Upper 256bit of... %zmmh31 (256 bits each). */
918 #define XSAVE_AVX512_ZMM16_H_ADDR(tdep, xsave, regnum) \
919 (xsave + (tdep)->xsave_layout.zmm_offset \
920 + xsave_avx512_zmm16_h_offset[regnum - I387_ZMM16H_REGNUM (tdep)])
922 /* At xsave_pkeys_offset[REGNUM] you'll find the relative offset
923 within the PKEYS region of the XSAVE extended state where the PKRU
924 register is stored. */
926 static int xsave_pkeys_offset[] =
928 0 * 8 /* %pkru (64 bits in XSTATE, 32-bit actually used by
929 instructions and applications). */
932 #define XSAVE_PKEYS_ADDR(tdep, xsave, regnum) \
933 (xsave + (tdep)->xsave_layout.pkru_offset \
934 + xsave_pkeys_offset[regnum - I387_PKRU_REGNUM (tdep)])
937 /* See i387-tdep.h. */
939 bool
940 i387_guess_xsave_layout (uint64_t xcr0, size_t xsave_size,
941 x86_xsave_layout &layout)
943 if (HAS_PKRU (xcr0) && xsave_size == 2696)
945 /* Intel CPUs supporting PKRU. */
946 layout.avx_offset = 576;
947 layout.bndregs_offset = 960;
948 layout.bndcfg_offset = 1024;
949 layout.k_offset = 1088;
950 layout.zmm_h_offset = 1152;
951 layout.zmm_offset = 1664;
952 layout.pkru_offset = 2688;
954 else if (HAS_PKRU (xcr0) && xsave_size == 2440)
956 /* AMD CPUs supporting PKRU. */
957 layout.avx_offset = 576;
958 layout.k_offset = 832;
959 layout.zmm_h_offset = 896;
960 layout.zmm_offset = 1408;
961 layout.pkru_offset = 2432;
963 else if (HAS_AVX512 (xcr0) && xsave_size == 2688)
965 /* Intel CPUs supporting AVX512. */
966 layout.avx_offset = 576;
967 layout.bndregs_offset = 960;
968 layout.bndcfg_offset = 1024;
969 layout.k_offset = 1088;
970 layout.zmm_h_offset = 1152;
971 layout.zmm_offset = 1664;
973 else if (HAS_MPX (xcr0) && xsave_size == 1088)
975 /* Intel CPUs supporting MPX. */
976 layout.avx_offset = 576;
977 layout.bndregs_offset = 960;
978 layout.bndcfg_offset = 1024;
980 else if (HAS_AVX (xcr0) && xsave_size == 832)
982 /* Intel and AMD CPUs supporting AVX. */
983 layout.avx_offset = 576;
985 else
986 return false;
988 layout.sizeof_xsave = xsave_size;
989 return true;
992 /* See i387-tdep.h. */
994 x86_xsave_layout
995 i387_fallback_xsave_layout (uint64_t xcr0)
997 x86_xsave_layout layout;
999 if (HAS_PKRU (xcr0))
1001 /* Intel CPUs supporting PKRU. */
1002 layout.avx_offset = 576;
1003 layout.bndregs_offset = 960;
1004 layout.bndcfg_offset = 1024;
1005 layout.k_offset = 1088;
1006 layout.zmm_h_offset = 1152;
1007 layout.zmm_offset = 1664;
1008 layout.pkru_offset = 2688;
1009 layout.sizeof_xsave = 2696;
1011 else if (HAS_AVX512 (xcr0))
1013 /* Intel CPUs supporting AVX512. */
1014 layout.avx_offset = 576;
1015 layout.bndregs_offset = 960;
1016 layout.bndcfg_offset = 1024;
1017 layout.k_offset = 1088;
1018 layout.zmm_h_offset = 1152;
1019 layout.zmm_offset = 1664;
1020 layout.sizeof_xsave = 2688;
1022 else if (HAS_MPX (xcr0))
1024 /* Intel CPUs supporting MPX. */
1025 layout.avx_offset = 576;
1026 layout.bndregs_offset = 960;
1027 layout.bndcfg_offset = 1024;
1028 layout.sizeof_xsave = 1088;
1030 else if (HAS_AVX (xcr0))
1032 /* Intel and AMD CPUs supporting AVX. */
1033 layout.avx_offset = 576;
1034 layout.sizeof_xsave = 832;
1037 return layout;
1040 /* Extract from XSAVE a bitset of the features that are available on the
1041 target, but which have not yet been enabled. */
1043 ULONGEST
1044 i387_xsave_get_clear_bv (struct gdbarch *gdbarch, const void *xsave)
1046 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
1047 const gdb_byte *regs = (const gdb_byte *) xsave;
1048 i386_gdbarch_tdep *tdep = gdbarch_tdep<i386_gdbarch_tdep> (gdbarch);
1050 /* Get `xstat_bv'. The supported bits in `xstat_bv' are 8 bytes. */
1051 ULONGEST xstate_bv = extract_unsigned_integer (XSAVE_XSTATE_BV_ADDR (regs),
1052 8, byte_order);
1054 /* Clear part in vector registers if its bit in xstat_bv is zero. */
1055 ULONGEST clear_bv = (~(xstate_bv)) & tdep->xcr0;
1057 return clear_bv;
1060 /* Similar to i387_supply_fxsave, but use XSAVE extended state. */
1062 void
1063 i387_supply_xsave (struct regcache *regcache, int regnum,
1064 const void *xsave)
1066 struct gdbarch *gdbarch = regcache->arch ();
1067 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
1068 i386_gdbarch_tdep *tdep = gdbarch_tdep<i386_gdbarch_tdep> (gdbarch);
1069 const gdb_byte *regs = (const gdb_byte *) xsave;
1070 int i;
1071 /* In 64-bit mode the split between "low" and "high" ZMM registers is at
1072 ZMM16. Outside of 64-bit mode there are no "high" ZMM registers at all.
1073 Precalculate the number to be used for the split point, with the all
1074 registers in the "low" portion outside of 64-bit mode. */
1075 unsigned int zmm_endlo_regnum = I387_ZMM0H_REGNUM (tdep)
1076 + std::min (tdep->num_zmm_regs, 16);
1077 ULONGEST clear_bv;
1078 static const gdb_byte zero[I386_MAX_REGISTER_SIZE] = { 0 };
1079 enum
1081 none = 0x0,
1082 x87 = 0x1,
1083 sse = 0x2,
1084 avxh = 0x4,
1085 bndregs = 0x8,
1086 bndcfg = 0x10,
1087 avx512_k = 0x20,
1088 avx512_zmm0_h = 0x40,
1089 avx512_zmm16_h = 0x80,
1090 avx512_ymmh_avx512 = 0x100,
1091 avx512_xmm_avx512 = 0x200,
1092 pkeys = 0x400,
1093 all = x87 | sse | avxh | bndregs | bndcfg | avx512_k | avx512_zmm0_h
1094 | avx512_zmm16_h | avx512_ymmh_avx512 | avx512_xmm_avx512 | pkeys
1095 } regclass;
1097 gdb_assert (regs != NULL);
1098 gdb_assert (tdep->st0_regnum >= I386_ST0_REGNUM);
1099 gdb_assert (tdep->num_xmm_regs > 0);
1101 if (regnum == -1)
1102 regclass = all;
1103 else if (regnum >= I387_PKRU_REGNUM (tdep)
1104 && regnum < I387_PKEYSEND_REGNUM (tdep))
1105 regclass = pkeys;
1106 else if (regnum >= I387_ZMM0H_REGNUM (tdep)
1107 && regnum < I387_ZMM16H_REGNUM (tdep))
1108 regclass = avx512_zmm0_h;
1109 else if (regnum >= I387_ZMM16H_REGNUM (tdep)
1110 && regnum < I387_ZMMENDH_REGNUM (tdep))
1111 regclass = avx512_zmm16_h;
1112 else if (regnum >= I387_K0_REGNUM (tdep)
1113 && regnum < I387_KEND_REGNUM (tdep))
1114 regclass = avx512_k;
1115 else if (regnum >= I387_YMM16H_REGNUM (tdep)
1116 && regnum < I387_YMMH_AVX512_END_REGNUM (tdep))
1117 regclass = avx512_ymmh_avx512;
1118 else if (regnum >= I387_XMM16_REGNUM (tdep)
1119 && regnum < I387_XMM_AVX512_END_REGNUM (tdep))
1120 regclass = avx512_xmm_avx512;
1121 else if (regnum >= I387_YMM0H_REGNUM (tdep)
1122 && regnum < I387_YMMENDH_REGNUM (tdep))
1123 regclass = avxh;
1124 else if (regnum >= I387_BND0R_REGNUM (tdep)
1125 && regnum < I387_BNDCFGU_REGNUM (tdep))
1126 regclass = bndregs;
1127 else if (regnum >= I387_BNDCFGU_REGNUM (tdep)
1128 && regnum < I387_MPXEND_REGNUM (tdep))
1129 regclass = bndcfg;
1130 else if (regnum >= I387_XMM0_REGNUM (tdep)
1131 && regnum < I387_MXCSR_REGNUM (tdep))
1132 regclass = sse;
1133 else if (regnum >= I387_ST0_REGNUM (tdep)
1134 && regnum < I387_FCTRL_REGNUM (tdep))
1135 regclass = x87;
1136 else
1137 regclass = none;
1139 clear_bv = i387_xsave_get_clear_bv (gdbarch, xsave);
1141 /* With the delayed xsave mechanism, in between the program
1142 starting, and the program accessing the vector registers for the
1143 first time, the register's values are invalid. The kernel
1144 initializes register states to zero when they are set the first
1145 time in a program. This means that from the user-space programs'
1146 perspective, it's the same as if the registers have always been
1147 zero from the start of the program. Therefore, the debugger
1148 should provide the same illusion to the user. */
1150 switch (regclass)
1152 case none:
1153 break;
1155 case pkeys:
1156 if ((clear_bv & X86_XSTATE_PKRU))
1157 regcache->raw_supply (regnum, zero);
1158 else
1159 regcache->raw_supply (regnum, XSAVE_PKEYS_ADDR (tdep, regs, regnum));
1160 return;
1162 case avx512_zmm0_h:
1163 if ((clear_bv & X86_XSTATE_ZMM_H))
1164 regcache->raw_supply (regnum, zero);
1165 else
1166 regcache->raw_supply (regnum,
1167 XSAVE_AVX512_ZMM0_H_ADDR (tdep, regs, regnum));
1168 return;
1170 case avx512_zmm16_h:
1171 if ((clear_bv & X86_XSTATE_ZMM))
1172 regcache->raw_supply (regnum, zero);
1173 else
1174 regcache->raw_supply (regnum,
1175 XSAVE_AVX512_ZMM16_H_ADDR (tdep, regs, regnum));
1176 return;
1178 case avx512_k:
1179 if ((clear_bv & X86_XSTATE_K))
1180 regcache->raw_supply (regnum, zero);
1181 else
1182 regcache->raw_supply (regnum, XSAVE_AVX512_K_ADDR (tdep, regs, regnum));
1183 return;
1185 case avx512_ymmh_avx512:
1186 if ((clear_bv & X86_XSTATE_ZMM))
1187 regcache->raw_supply (regnum, zero);
1188 else
1189 regcache->raw_supply (regnum,
1190 XSAVE_YMM_H_AVX512_ADDR (tdep, regs, regnum));
1191 return;
1193 case avx512_xmm_avx512:
1194 if ((clear_bv & X86_XSTATE_ZMM))
1195 regcache->raw_supply (regnum, zero);
1196 else
1197 regcache->raw_supply (regnum,
1198 XSAVE_XMM_AVX512_ADDR (tdep, regs, regnum));
1199 return;
1201 case avxh:
1202 if ((clear_bv & X86_XSTATE_AVX))
1203 regcache->raw_supply (regnum, zero);
1204 else
1205 regcache->raw_supply (regnum, XSAVE_AVXH_ADDR (tdep, regs, regnum));
1206 return;
1208 case bndcfg:
1209 if ((clear_bv & X86_XSTATE_BNDCFG))
1210 regcache->raw_supply (regnum, zero);
1211 else
1212 regcache->raw_supply (regnum, XSAVE_BNDCFG_ADDR (tdep, regs, regnum));
1213 return;
1215 case bndregs:
1216 if ((clear_bv & X86_XSTATE_BNDREGS))
1217 regcache->raw_supply (regnum, zero);
1218 else
1219 regcache->raw_supply (regnum, XSAVE_BNDREGS_ADDR (tdep, regs, regnum));
1220 return;
1222 case sse:
1223 if ((clear_bv & X86_XSTATE_SSE))
1224 regcache->raw_supply (regnum, zero);
1225 else
1226 regcache->raw_supply (regnum, FXSAVE_ADDR (tdep, regs, regnum));
1227 return;
1229 case x87:
1230 if ((clear_bv & X86_XSTATE_X87))
1231 regcache->raw_supply (regnum, zero);
1232 else
1233 regcache->raw_supply (regnum, FXSAVE_ADDR (tdep, regs, regnum));
1234 return;
1236 case all:
1237 /* Handle PKEYS registers. */
1238 if ((tdep->xcr0 & X86_XSTATE_PKRU))
1240 if ((clear_bv & X86_XSTATE_PKRU))
1242 for (i = I387_PKRU_REGNUM (tdep);
1243 i < I387_PKEYSEND_REGNUM (tdep);
1244 i++)
1245 regcache->raw_supply (i, zero);
1247 else
1249 for (i = I387_PKRU_REGNUM (tdep);
1250 i < I387_PKEYSEND_REGNUM (tdep);
1251 i++)
1252 regcache->raw_supply (i, XSAVE_PKEYS_ADDR (tdep, regs, i));
1256 /* Handle the upper halves of the low 8/16 ZMM registers. */
1257 if ((tdep->xcr0 & X86_XSTATE_ZMM_H))
1259 if ((clear_bv & X86_XSTATE_ZMM_H))
1261 for (i = I387_ZMM0H_REGNUM (tdep); i < zmm_endlo_regnum; i++)
1262 regcache->raw_supply (i, zero);
1264 else
1266 for (i = I387_ZMM0H_REGNUM (tdep); i < zmm_endlo_regnum; i++)
1267 regcache->raw_supply (i,
1268 XSAVE_AVX512_ZMM0_H_ADDR (tdep, regs, i));
1272 /* Handle AVX512 OpMask registers. */
1273 if ((tdep->xcr0 & X86_XSTATE_K))
1275 if ((clear_bv & X86_XSTATE_K))
1277 for (i = I387_K0_REGNUM (tdep);
1278 i < I387_KEND_REGNUM (tdep);
1279 i++)
1280 regcache->raw_supply (i, zero);
1282 else
1284 for (i = I387_K0_REGNUM (tdep);
1285 i < I387_KEND_REGNUM (tdep);
1286 i++)
1287 regcache->raw_supply (i, XSAVE_AVX512_K_ADDR (tdep, regs, i));
1291 /* Handle the upper 16 ZMM/YMM/XMM registers (if any). */
1292 if ((tdep->xcr0 & X86_XSTATE_ZMM))
1294 if ((clear_bv & X86_XSTATE_ZMM))
1296 for (i = I387_ZMM16H_REGNUM (tdep);
1297 i < I387_ZMMENDH_REGNUM (tdep); i++)
1298 regcache->raw_supply (i, zero);
1299 for (i = I387_YMM16H_REGNUM (tdep);
1300 i < I387_YMMH_AVX512_END_REGNUM (tdep);
1301 i++)
1302 regcache->raw_supply (i, zero);
1303 for (i = I387_XMM16_REGNUM (tdep);
1304 i < I387_XMM_AVX512_END_REGNUM (tdep);
1305 i++)
1306 regcache->raw_supply (i, zero);
1308 else
1310 for (i = I387_ZMM16H_REGNUM (tdep);
1311 i < I387_ZMMENDH_REGNUM (tdep); i++)
1312 regcache->raw_supply (i,
1313 XSAVE_AVX512_ZMM16_H_ADDR (tdep, regs, i));
1314 for (i = I387_YMM16H_REGNUM (tdep);
1315 i < I387_YMMH_AVX512_END_REGNUM (tdep);
1316 i++)
1317 regcache->raw_supply (i,
1318 XSAVE_YMM_H_AVX512_ADDR (tdep, regs, i));
1319 for (i = I387_XMM16_REGNUM (tdep);
1320 i < I387_XMM_AVX512_END_REGNUM (tdep);
1321 i++)
1322 regcache->raw_supply (i, XSAVE_XMM_AVX512_ADDR (tdep, regs, i));
1325 /* Handle the upper YMM registers. */
1326 if ((tdep->xcr0 & X86_XSTATE_AVX))
1328 if ((clear_bv & X86_XSTATE_AVX))
1330 for (i = I387_YMM0H_REGNUM (tdep);
1331 i < I387_YMMENDH_REGNUM (tdep);
1332 i++)
1333 regcache->raw_supply (i, zero);
1335 else
1337 for (i = I387_YMM0H_REGNUM (tdep);
1338 i < I387_YMMENDH_REGNUM (tdep);
1339 i++)
1340 regcache->raw_supply (i, XSAVE_AVXH_ADDR (tdep, regs, i));
1344 /* Handle the MPX registers. */
1345 if ((tdep->xcr0 & X86_XSTATE_BNDREGS))
1347 if (clear_bv & X86_XSTATE_BNDREGS)
1349 for (i = I387_BND0R_REGNUM (tdep);
1350 i < I387_BNDCFGU_REGNUM (tdep); i++)
1351 regcache->raw_supply (i, zero);
1353 else
1355 for (i = I387_BND0R_REGNUM (tdep);
1356 i < I387_BNDCFGU_REGNUM (tdep); i++)
1357 regcache->raw_supply (i, XSAVE_BNDREGS_ADDR (tdep, regs, i));
1361 /* Handle the MPX registers. */
1362 if ((tdep->xcr0 & X86_XSTATE_BNDCFG))
1364 if (clear_bv & X86_XSTATE_BNDCFG)
1366 for (i = I387_BNDCFGU_REGNUM (tdep);
1367 i < I387_MPXEND_REGNUM (tdep); i++)
1368 regcache->raw_supply (i, zero);
1370 else
1372 for (i = I387_BNDCFGU_REGNUM (tdep);
1373 i < I387_MPXEND_REGNUM (tdep); i++)
1374 regcache->raw_supply (i, XSAVE_BNDCFG_ADDR (tdep, regs, i));
1378 /* Handle the XMM registers. */
1379 if ((tdep->xcr0 & X86_XSTATE_SSE))
1381 if ((clear_bv & X86_XSTATE_SSE))
1383 for (i = I387_XMM0_REGNUM (tdep);
1384 i < I387_MXCSR_REGNUM (tdep);
1385 i++)
1386 regcache->raw_supply (i, zero);
1388 else
1390 for (i = I387_XMM0_REGNUM (tdep);
1391 i < I387_MXCSR_REGNUM (tdep); i++)
1392 regcache->raw_supply (i, FXSAVE_ADDR (tdep, regs, i));
1396 /* Handle the x87 registers. */
1397 if ((tdep->xcr0 & X86_XSTATE_X87))
1399 if ((clear_bv & X86_XSTATE_X87))
1401 for (i = I387_ST0_REGNUM (tdep);
1402 i < I387_FCTRL_REGNUM (tdep);
1403 i++)
1404 regcache->raw_supply (i, zero);
1406 else
1408 for (i = I387_ST0_REGNUM (tdep);
1409 i < I387_FCTRL_REGNUM (tdep);
1410 i++)
1411 regcache->raw_supply (i, FXSAVE_ADDR (tdep, regs, i));
1414 break;
1417 /* Only handle x87 control registers. */
1418 for (i = I387_FCTRL_REGNUM (tdep); i < I387_XMM0_REGNUM (tdep); i++)
1419 if (regnum == -1 || regnum == i)
1421 if (clear_bv & X86_XSTATE_X87)
1423 if (i == I387_FCTRL_REGNUM (tdep))
1425 gdb_byte buf[4];
1427 store_unsigned_integer (buf, 4, byte_order,
1428 I387_FCTRL_INIT_VAL);
1429 regcache->raw_supply (i, buf);
1431 else if (i == I387_FTAG_REGNUM (tdep))
1433 gdb_byte buf[4];
1435 store_unsigned_integer (buf, 4, byte_order, 0xffff);
1436 regcache->raw_supply (i, buf);
1438 else
1439 regcache->raw_supply (i, zero);
1441 /* Most of the FPU control registers occupy only 16 bits in
1442 the xsave extended state. Give those a special treatment. */
1443 else if (i != I387_FIOFF_REGNUM (tdep)
1444 && i != I387_FOOFF_REGNUM (tdep))
1446 gdb_byte val[4];
1448 memcpy (val, FXSAVE_ADDR (tdep, regs, i), 2);
1449 val[2] = val[3] = 0;
1450 if (i == I387_FOP_REGNUM (tdep))
1451 val[1] &= ((1 << 3) - 1);
1452 else if (i == I387_FTAG_REGNUM (tdep))
1454 /* The fxsave area contains a simplified version of
1455 the tag word. We have to look at the actual 80-bit
1456 FP data to recreate the traditional i387 tag word. */
1458 unsigned long ftag = 0;
1459 int fpreg;
1460 int top;
1462 top = ((FXSAVE_ADDR (tdep, regs,
1463 I387_FSTAT_REGNUM (tdep)))[1] >> 3);
1464 top &= 0x7;
1466 for (fpreg = 7; fpreg >= 0; fpreg--)
1468 int tag;
1470 if (val[0] & (1 << fpreg))
1472 int thisreg = (fpreg + 8 - top) % 8
1473 + I387_ST0_REGNUM (tdep);
1474 tag = i387_tag (FXSAVE_ADDR (tdep, regs, thisreg));
1476 else
1477 tag = 3; /* Empty */
1479 ftag |= tag << (2 * fpreg);
1481 val[0] = ftag & 0xff;
1482 val[1] = (ftag >> 8) & 0xff;
1484 regcache->raw_supply (i, val);
1486 else
1487 regcache->raw_supply (i, FXSAVE_ADDR (tdep, regs, i));
1490 if (regnum == I387_MXCSR_REGNUM (tdep) || regnum == -1)
1492 /* The MXCSR register is placed into the xsave buffer if either the
1493 AVX or SSE features are enabled. */
1494 if ((clear_bv & (X86_XSTATE_AVX | X86_XSTATE_SSE))
1495 == (X86_XSTATE_AVX | X86_XSTATE_SSE))
1497 gdb_byte buf[4];
1499 store_unsigned_integer (buf, 4, byte_order, I387_MXCSR_INIT_VAL);
1500 regcache->raw_supply (I387_MXCSR_REGNUM (tdep), buf);
1502 else
1503 regcache->raw_supply (I387_MXCSR_REGNUM (tdep),
1504 FXSAVE_MXCSR_ADDR (regs));
1508 /* Similar to i387_collect_fxsave, but use XSAVE extended state. */
1510 void
1511 i387_collect_xsave (const struct regcache *regcache, int regnum,
1512 void *xsave, int gcore)
1514 struct gdbarch *gdbarch = regcache->arch ();
1515 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
1516 i386_gdbarch_tdep *tdep = gdbarch_tdep<i386_gdbarch_tdep> (gdbarch);
1517 gdb_byte *p, *regs = (gdb_byte *) xsave;
1518 gdb_byte raw[I386_MAX_REGISTER_SIZE];
1519 ULONGEST initial_xstate_bv, clear_bv, xstate_bv = 0;
1520 unsigned int i;
1521 /* See the comment in i387_supply_xsave(). */
1522 unsigned int zmm_endlo_regnum = I387_ZMM0H_REGNUM (tdep)
1523 + std::min (tdep->num_zmm_regs, 16);
1524 enum
1526 x87_ctrl_or_mxcsr = 0x1,
1527 x87 = 0x2,
1528 sse = 0x4,
1529 avxh = 0x8,
1530 bndregs = 0x10,
1531 bndcfg = 0x20,
1532 avx512_k = 0x40,
1533 avx512_zmm0_h = 0x80,
1534 avx512_zmm16_h = 0x100,
1535 avx512_ymmh_avx512 = 0x200,
1536 avx512_xmm_avx512 = 0x400,
1537 pkeys = 0x800,
1538 all = x87 | sse | avxh | bndregs | bndcfg | avx512_k | avx512_zmm0_h
1539 | avx512_zmm16_h | avx512_ymmh_avx512 | avx512_xmm_avx512 | pkeys
1540 } regclass;
1542 gdb_assert (tdep->st0_regnum >= I386_ST0_REGNUM);
1543 gdb_assert (tdep->num_xmm_regs > 0);
1545 if (regnum == -1)
1546 regclass = all;
1547 else if (regnum >= I387_PKRU_REGNUM (tdep)
1548 && regnum < I387_PKEYSEND_REGNUM (tdep))
1549 regclass = pkeys;
1550 else if (regnum >= I387_ZMM0H_REGNUM (tdep)
1551 && regnum < I387_ZMM16H_REGNUM (tdep))
1552 regclass = avx512_zmm0_h;
1553 else if (regnum >= I387_ZMM16H_REGNUM (tdep)
1554 && regnum < I387_ZMMENDH_REGNUM (tdep))
1555 regclass = avx512_zmm16_h;
1556 else if (regnum >= I387_K0_REGNUM (tdep)
1557 && regnum < I387_KEND_REGNUM (tdep))
1558 regclass = avx512_k;
1559 else if (regnum >= I387_YMM16H_REGNUM (tdep)
1560 && regnum < I387_YMMH_AVX512_END_REGNUM (tdep))
1561 regclass = avx512_ymmh_avx512;
1562 else if (regnum >= I387_XMM16_REGNUM (tdep)
1563 && regnum < I387_XMM_AVX512_END_REGNUM (tdep))
1564 regclass = avx512_xmm_avx512;
1565 else if (regnum >= I387_YMM0H_REGNUM (tdep)
1566 && regnum < I387_YMMENDH_REGNUM (tdep))
1567 regclass = avxh;
1568 else if (regnum >= I387_BND0R_REGNUM (tdep)
1569 && regnum < I387_BNDCFGU_REGNUM (tdep))
1570 regclass = bndregs;
1571 else if (regnum >= I387_BNDCFGU_REGNUM (tdep)
1572 && regnum < I387_MPXEND_REGNUM (tdep))
1573 regclass = bndcfg;
1574 else if (regnum >= I387_XMM0_REGNUM (tdep)
1575 && regnum < I387_MXCSR_REGNUM (tdep))
1576 regclass = sse;
1577 else if (regnum >= I387_ST0_REGNUM (tdep)
1578 && regnum < I387_FCTRL_REGNUM (tdep))
1579 regclass = x87;
1580 else if ((regnum >= I387_FCTRL_REGNUM (tdep)
1581 && regnum < I387_XMM0_REGNUM (tdep))
1582 || regnum == I387_MXCSR_REGNUM (tdep))
1583 regclass = x87_ctrl_or_mxcsr;
1584 else
1585 internal_error (_("invalid i387 regnum %d"), regnum);
1587 if (gcore)
1589 /* Clear XSAVE extended state. */
1590 memset (regs, 0, tdep->xsave_layout.sizeof_xsave);
1592 /* Update XCR0 and `xstate_bv' with XCR0 for gcore. */
1593 if (tdep->xsave_xcr0_offset != -1)
1594 memcpy (regs + tdep->xsave_xcr0_offset, &tdep->xcr0, 8);
1595 memcpy (XSAVE_XSTATE_BV_ADDR (regs), &tdep->xcr0, 8);
1598 /* The supported bits in `xstat_bv' are 8 bytes. */
1599 initial_xstate_bv = extract_unsigned_integer (XSAVE_XSTATE_BV_ADDR (regs),
1600 8, byte_order);
1601 clear_bv = (~(initial_xstate_bv)) & tdep->xcr0;
1603 /* The XSAVE buffer was filled lazily by the kernel. Only those
1604 features that are enabled were written into the buffer, disabled
1605 features left the buffer uninitialised. In order to identify if any
1606 registers have changed we will be comparing the register cache
1607 version to the version in the XSAVE buffer, it is important then that
1608 at this point we initialise to the default values any features in
1609 XSAVE that are not yet initialised.
1611 This could be made more efficient, we know which features (from
1612 REGNUM) we will be potentially updating, and could limit ourselves to
1613 only clearing that feature. However, the extra complexity does not
1614 seem justified at this point. */
1615 if (clear_bv)
1617 if ((clear_bv & X86_XSTATE_PKRU))
1618 for (i = I387_PKRU_REGNUM (tdep);
1619 i < I387_PKEYSEND_REGNUM (tdep); i++)
1620 memset (XSAVE_PKEYS_ADDR (tdep, regs, i), 0, 4);
1622 if ((clear_bv & X86_XSTATE_BNDREGS))
1623 for (i = I387_BND0R_REGNUM (tdep);
1624 i < I387_BNDCFGU_REGNUM (tdep); i++)
1625 memset (XSAVE_BNDREGS_ADDR (tdep, regs, i), 0, 16);
1627 if ((clear_bv & X86_XSTATE_BNDCFG))
1628 for (i = I387_BNDCFGU_REGNUM (tdep);
1629 i < I387_MPXEND_REGNUM (tdep); i++)
1630 memset (XSAVE_BNDCFG_ADDR (tdep, regs, i), 0, 8);
1632 if ((clear_bv & X86_XSTATE_ZMM_H))
1633 for (i = I387_ZMM0H_REGNUM (tdep); i < zmm_endlo_regnum; i++)
1634 memset (XSAVE_AVX512_ZMM0_H_ADDR (tdep, regs, i), 0, 32);
1636 if ((clear_bv & X86_XSTATE_K))
1637 for (i = I387_K0_REGNUM (tdep);
1638 i < I387_KEND_REGNUM (tdep); i++)
1639 memset (XSAVE_AVX512_K_ADDR (tdep, regs, i), 0, 8);
1641 if ((clear_bv & X86_XSTATE_ZMM))
1643 for (i = I387_ZMM16H_REGNUM (tdep); i < I387_ZMMENDH_REGNUM (tdep);
1644 i++)
1645 memset (XSAVE_AVX512_ZMM16_H_ADDR (tdep, regs, i), 0, 32);
1646 for (i = I387_YMM16H_REGNUM (tdep);
1647 i < I387_YMMH_AVX512_END_REGNUM (tdep); i++)
1648 memset (XSAVE_YMM_H_AVX512_ADDR (tdep, regs, i), 0, 16);
1649 for (i = I387_XMM16_REGNUM (tdep);
1650 i < I387_XMM_AVX512_END_REGNUM (tdep); i++)
1651 memset (XSAVE_XMM_AVX512_ADDR (tdep, regs, i), 0, 16);
1654 if ((clear_bv & X86_XSTATE_AVX))
1655 for (i = I387_YMM0H_REGNUM (tdep);
1656 i < I387_YMMENDH_REGNUM (tdep); i++)
1657 memset (XSAVE_AVXH_ADDR (tdep, regs, i), 0, 16);
1659 if ((clear_bv & X86_XSTATE_SSE))
1660 for (i = I387_XMM0_REGNUM (tdep);
1661 i < I387_MXCSR_REGNUM (tdep); i++)
1662 memset (FXSAVE_ADDR (tdep, regs, i), 0, 16);
1664 /* The mxcsr register is written into the xsave buffer if either AVX
1665 or SSE is enabled, so only clear it if both of those features
1666 require clearing. */
1667 if ((clear_bv & (X86_XSTATE_AVX | X86_XSTATE_SSE))
1668 == (X86_XSTATE_AVX | X86_XSTATE_SSE))
1669 store_unsigned_integer (FXSAVE_MXCSR_ADDR (regs), 2, byte_order,
1670 I387_MXCSR_INIT_VAL);
1672 if ((clear_bv & X86_XSTATE_X87))
1674 for (i = I387_ST0_REGNUM (tdep);
1675 i < I387_FCTRL_REGNUM (tdep); i++)
1676 memset (FXSAVE_ADDR (tdep, regs, i), 0, 10);
1678 for (i = I387_FCTRL_REGNUM (tdep);
1679 i < I387_XMM0_REGNUM (tdep); i++)
1681 if (i == I387_FCTRL_REGNUM (tdep))
1682 store_unsigned_integer (FXSAVE_ADDR (tdep, regs, i), 2,
1683 byte_order, I387_FCTRL_INIT_VAL);
1684 else
1685 memset (FXSAVE_ADDR (tdep, regs, i), 0,
1686 regcache_register_size (regcache, i));
1691 if (regclass == all)
1693 /* Check if any PKEYS registers are changed. */
1694 if ((tdep->xcr0 & X86_XSTATE_PKRU))
1695 for (i = I387_PKRU_REGNUM (tdep);
1696 i < I387_PKEYSEND_REGNUM (tdep); i++)
1698 regcache->raw_collect (i, raw);
1699 p = XSAVE_PKEYS_ADDR (tdep, regs, i);
1700 if (memcmp (raw, p, 4) != 0)
1702 xstate_bv |= X86_XSTATE_PKRU;
1703 memcpy (p, raw, 4);
1707 /* Check if any ZMMH registers are changed. */
1708 if ((tdep->xcr0 & X86_XSTATE_ZMM))
1709 for (i = I387_ZMM16H_REGNUM (tdep);
1710 i < I387_ZMMENDH_REGNUM (tdep); i++)
1712 regcache->raw_collect (i, raw);
1713 p = XSAVE_AVX512_ZMM16_H_ADDR (tdep, regs, i);
1714 if (memcmp (raw, p, 32) != 0)
1716 xstate_bv |= X86_XSTATE_ZMM;
1717 memcpy (p, raw, 32);
1721 if ((tdep->xcr0 & X86_XSTATE_ZMM_H))
1722 for (i = I387_ZMM0H_REGNUM (tdep); i < zmm_endlo_regnum; i++)
1724 regcache->raw_collect (i, raw);
1725 p = XSAVE_AVX512_ZMM0_H_ADDR (tdep, regs, i);
1726 if (memcmp (raw, p, 32) != 0)
1728 xstate_bv |= X86_XSTATE_ZMM_H;
1729 memcpy (p, raw, 32);
1733 /* Check if any K registers are changed. */
1734 if ((tdep->xcr0 & X86_XSTATE_K))
1735 for (i = I387_K0_REGNUM (tdep);
1736 i < I387_KEND_REGNUM (tdep); i++)
1738 regcache->raw_collect (i, raw);
1739 p = XSAVE_AVX512_K_ADDR (tdep, regs, i);
1740 if (memcmp (raw, p, 8) != 0)
1742 xstate_bv |= X86_XSTATE_K;
1743 memcpy (p, raw, 8);
1747 /* Check if any XMM or upper YMM registers are changed. */
1748 if ((tdep->xcr0 & X86_XSTATE_ZMM))
1750 for (i = I387_YMM16H_REGNUM (tdep);
1751 i < I387_YMMH_AVX512_END_REGNUM (tdep); i++)
1753 regcache->raw_collect (i, raw);
1754 p = XSAVE_YMM_H_AVX512_ADDR (tdep, regs, i);
1755 if (memcmp (raw, p, 16) != 0)
1757 xstate_bv |= X86_XSTATE_ZMM;
1758 memcpy (p, raw, 16);
1761 for (i = I387_XMM16_REGNUM (tdep);
1762 i < I387_XMM_AVX512_END_REGNUM (tdep); i++)
1764 regcache->raw_collect (i, raw);
1765 p = XSAVE_XMM_AVX512_ADDR (tdep, regs, i);
1766 if (memcmp (raw, p, 16) != 0)
1768 xstate_bv |= X86_XSTATE_ZMM;
1769 memcpy (p, raw, 16);
1774 /* Check if any upper MPX registers are changed. */
1775 if ((tdep->xcr0 & X86_XSTATE_BNDREGS))
1776 for (i = I387_BND0R_REGNUM (tdep);
1777 i < I387_BNDCFGU_REGNUM (tdep); i++)
1779 regcache->raw_collect (i, raw);
1780 p = XSAVE_BNDREGS_ADDR (tdep, regs, i);
1781 if (memcmp (raw, p, 16))
1783 xstate_bv |= X86_XSTATE_BNDREGS;
1784 memcpy (p, raw, 16);
1788 /* Check if any upper MPX registers are changed. */
1789 if ((tdep->xcr0 & X86_XSTATE_BNDCFG))
1790 for (i = I387_BNDCFGU_REGNUM (tdep);
1791 i < I387_MPXEND_REGNUM (tdep); i++)
1793 regcache->raw_collect (i, raw);
1794 p = XSAVE_BNDCFG_ADDR (tdep, regs, i);
1795 if (memcmp (raw, p, 8))
1797 xstate_bv |= X86_XSTATE_BNDCFG;
1798 memcpy (p, raw, 8);
1802 /* Check if any upper YMM registers are changed. */
1803 if ((tdep->xcr0 & X86_XSTATE_AVX))
1804 for (i = I387_YMM0H_REGNUM (tdep);
1805 i < I387_YMMENDH_REGNUM (tdep); i++)
1807 regcache->raw_collect (i, raw);
1808 p = XSAVE_AVXH_ADDR (tdep, regs, i);
1809 if (memcmp (raw, p, 16))
1811 xstate_bv |= X86_XSTATE_AVX;
1812 memcpy (p, raw, 16);
1816 /* Check if any SSE registers are changed. */
1817 if ((tdep->xcr0 & X86_XSTATE_SSE))
1818 for (i = I387_XMM0_REGNUM (tdep);
1819 i < I387_MXCSR_REGNUM (tdep); i++)
1821 regcache->raw_collect (i, raw);
1822 p = FXSAVE_ADDR (tdep, regs, i);
1823 if (memcmp (raw, p, 16))
1825 xstate_bv |= X86_XSTATE_SSE;
1826 memcpy (p, raw, 16);
1830 if ((tdep->xcr0 & X86_XSTATE_AVX) || (tdep->xcr0 & X86_XSTATE_SSE))
1832 i = I387_MXCSR_REGNUM (tdep);
1833 regcache->raw_collect (i, raw);
1834 p = FXSAVE_MXCSR_ADDR (regs);
1835 if (memcmp (raw, p, 4))
1837 /* Now, we need to mark one of either SSE of AVX as enabled.
1838 We could pick either. What we do is check to see if one
1839 of the features is already enabled, if it is then we leave
1840 it at that, otherwise we pick SSE. */
1841 if ((xstate_bv & (X86_XSTATE_SSE | X86_XSTATE_AVX)) == 0)
1842 xstate_bv |= X86_XSTATE_SSE;
1843 memcpy (p, raw, 4);
1847 /* Check if any X87 registers are changed. Only the non-control
1848 registers are handled here, the control registers are all handled
1849 later on in this function. */
1850 if ((tdep->xcr0 & X86_XSTATE_X87))
1851 for (i = I387_ST0_REGNUM (tdep);
1852 i < I387_FCTRL_REGNUM (tdep); i++)
1854 regcache->raw_collect (i, raw);
1855 p = FXSAVE_ADDR (tdep, regs, i);
1856 if (memcmp (raw, p, 10))
1858 xstate_bv |= X86_XSTATE_X87;
1859 memcpy (p, raw, 10);
1863 else
1865 /* Check if REGNUM is changed. */
1866 regcache->raw_collect (regnum, raw);
1868 switch (regclass)
1870 default:
1871 internal_error (_("invalid i387 regclass"));
1873 case pkeys:
1874 /* This is a PKEYS register. */
1875 p = XSAVE_PKEYS_ADDR (tdep, regs, regnum);
1876 if (memcmp (raw, p, 4) != 0)
1878 xstate_bv |= X86_XSTATE_PKRU;
1879 memcpy (p, raw, 4);
1881 break;
1883 case avx512_zmm16_h:
1884 /* This is a ZMM16-31 register. */
1885 p = XSAVE_AVX512_ZMM16_H_ADDR (tdep, regs, regnum);
1886 if (memcmp (raw, p, 32) != 0)
1888 xstate_bv |= X86_XSTATE_ZMM;
1889 memcpy (p, raw, 32);
1891 break;
1893 case avx512_zmm0_h:
1894 /* This is a ZMM0-15 register. */
1895 p = XSAVE_AVX512_ZMM0_H_ADDR (tdep, regs, regnum);
1896 if (memcmp (raw, p, 32) != 0)
1898 xstate_bv |= X86_XSTATE_ZMM_H;
1899 memcpy (p, raw, 32);
1901 break;
1903 case avx512_k:
1904 /* This is a AVX512 mask register. */
1905 p = XSAVE_AVX512_K_ADDR (tdep, regs, regnum);
1906 if (memcmp (raw, p, 8) != 0)
1908 xstate_bv |= X86_XSTATE_K;
1909 memcpy (p, raw, 8);
1911 break;
1913 case avx512_ymmh_avx512:
1914 /* This is an upper YMM16-31 register. */
1915 p = XSAVE_YMM_H_AVX512_ADDR (tdep, regs, regnum);
1916 if (memcmp (raw, p, 16) != 0)
1918 xstate_bv |= X86_XSTATE_ZMM;
1919 memcpy (p, raw, 16);
1921 break;
1923 case avx512_xmm_avx512:
1924 /* This is an upper XMM16-31 register. */
1925 p = XSAVE_XMM_AVX512_ADDR (tdep, regs, regnum);
1926 if (memcmp (raw, p, 16) != 0)
1928 xstate_bv |= X86_XSTATE_ZMM;
1929 memcpy (p, raw, 16);
1931 break;
1933 case avxh:
1934 /* This is an upper YMM register. */
1935 p = XSAVE_AVXH_ADDR (tdep, regs, regnum);
1936 if (memcmp (raw, p, 16))
1938 xstate_bv |= X86_XSTATE_AVX;
1939 memcpy (p, raw, 16);
1941 break;
1943 case bndregs:
1944 regcache->raw_collect (regnum, raw);
1945 p = XSAVE_BNDREGS_ADDR (tdep, regs, regnum);
1946 if (memcmp (raw, p, 16))
1948 xstate_bv |= X86_XSTATE_BNDREGS;
1949 memcpy (p, raw, 16);
1951 break;
1953 case bndcfg:
1954 p = XSAVE_BNDCFG_ADDR (tdep, regs, regnum);
1955 xstate_bv |= X86_XSTATE_BNDCFG;
1956 memcpy (p, raw, 8);
1957 break;
1959 case sse:
1960 /* This is an SSE register. */
1961 p = FXSAVE_ADDR (tdep, regs, regnum);
1962 if (memcmp (raw, p, 16))
1964 xstate_bv |= X86_XSTATE_SSE;
1965 memcpy (p, raw, 16);
1967 break;
1969 case x87:
1970 /* This is an x87 register. */
1971 p = FXSAVE_ADDR (tdep, regs, regnum);
1972 if (memcmp (raw, p, 10))
1974 xstate_bv |= X86_XSTATE_X87;
1975 memcpy (p, raw, 10);
1977 break;
1979 case x87_ctrl_or_mxcsr:
1980 /* We only handle MXCSR here. All other x87 control registers
1981 are handled separately below. */
1982 if (regnum == I387_MXCSR_REGNUM (tdep))
1984 p = FXSAVE_MXCSR_ADDR (regs);
1985 if (memcmp (raw, p, 2))
1987 /* We're only setting MXCSR, so check the initial state
1988 to see if either of AVX or SSE are already enabled.
1989 If they are then we'll attribute this changed MXCSR to
1990 that feature. If neither feature is enabled, then
1991 we'll attribute this change to the SSE feature. */
1992 xstate_bv |= (initial_xstate_bv
1993 & (X86_XSTATE_AVX | X86_XSTATE_SSE));
1994 if ((xstate_bv & (X86_XSTATE_AVX | X86_XSTATE_SSE)) == 0)
1995 xstate_bv |= X86_XSTATE_SSE;
1996 memcpy (p, raw, 2);
2002 /* Only handle x87 control registers. */
2003 for (i = I387_FCTRL_REGNUM (tdep); i < I387_XMM0_REGNUM (tdep); i++)
2004 if (regnum == -1 || regnum == i)
2006 /* Most of the FPU control registers occupy only 16 bits in
2007 the xsave extended state. Give those a special treatment. */
2008 if (i != I387_FIOFF_REGNUM (tdep)
2009 && i != I387_FOOFF_REGNUM (tdep))
2011 gdb_byte buf[4];
2013 regcache->raw_collect (i, buf);
2015 if (i == I387_FOP_REGNUM (tdep))
2017 /* The opcode occupies only 11 bits. Make sure we
2018 don't touch the other bits. */
2019 buf[1] &= ((1 << 3) - 1);
2020 buf[1] |= ((FXSAVE_ADDR (tdep, regs, i))[1] & ~((1 << 3) - 1));
2022 else if (i == I387_FTAG_REGNUM (tdep))
2024 /* Converting back is much easier. */
2026 unsigned short ftag;
2027 int fpreg;
2029 ftag = (buf[1] << 8) | buf[0];
2030 buf[0] = 0;
2031 buf[1] = 0;
2033 for (fpreg = 7; fpreg >= 0; fpreg--)
2035 int tag = (ftag >> (fpreg * 2)) & 3;
2037 if (tag != 3)
2038 buf[0] |= (1 << fpreg);
2041 p = FXSAVE_ADDR (tdep, regs, i);
2042 if (memcmp (p, buf, 2))
2044 xstate_bv |= X86_XSTATE_X87;
2045 memcpy (p, buf, 2);
2048 else
2050 int regsize;
2052 regcache->raw_collect (i, raw);
2053 regsize = regcache_register_size (regcache, i);
2054 p = FXSAVE_ADDR (tdep, regs, i);
2055 if (memcmp (raw, p, regsize))
2057 xstate_bv |= X86_XSTATE_X87;
2058 memcpy (p, raw, regsize);
2063 /* Update the corresponding bits in `xstate_bv' if any
2064 registers are changed. */
2065 if (xstate_bv)
2067 /* The supported bits in `xstat_bv' are 8 bytes. */
2068 initial_xstate_bv |= xstate_bv;
2069 store_unsigned_integer (XSAVE_XSTATE_BV_ADDR (regs),
2070 8, byte_order,
2071 initial_xstate_bv);
2075 /* Recreate the FTW (tag word) valid bits from the 80-bit FP data in
2076 *RAW. */
2078 static int
2079 i387_tag (const gdb_byte *raw)
2081 int integer;
2082 unsigned int exponent;
2083 unsigned long fraction[2];
2085 integer = raw[7] & 0x80;
2086 exponent = (((raw[9] & 0x7f) << 8) | raw[8]);
2087 fraction[0] = ((raw[3] << 24) | (raw[2] << 16) | (raw[1] << 8) | raw[0]);
2088 fraction[1] = (((raw[7] & 0x7f) << 24) | (raw[6] << 16)
2089 | (raw[5] << 8) | raw[4]);
2091 if (exponent == 0x7fff)
2093 /* Special. */
2094 return (2);
2096 else if (exponent == 0x0000)
2098 if (fraction[0] == 0x0000 && fraction[1] == 0x0000 && !integer)
2100 /* Zero. */
2101 return (1);
2103 else
2105 /* Special. */
2106 return (2);
2109 else
2111 if (integer)
2113 /* Valid. */
2114 return (0);
2116 else
2118 /* Special. */
2119 return (2);
2124 /* Prepare the FPU stack in REGCACHE for a function return. */
2126 void
2127 i387_return_value (struct gdbarch *gdbarch, struct regcache *regcache)
2129 i386_gdbarch_tdep *tdep = gdbarch_tdep<i386_gdbarch_tdep> (gdbarch);
2130 ULONGEST fstat;
2132 /* Set the top of the floating-point register stack to 7. The
2133 actual value doesn't really matter, but 7 is what a normal
2134 function return would end up with if the program started out with
2135 a freshly initialized FPU. */
2136 regcache_raw_read_unsigned (regcache, I387_FSTAT_REGNUM (tdep), &fstat);
2137 fstat |= (7 << 11);
2138 regcache_raw_write_unsigned (regcache, I387_FSTAT_REGNUM (tdep), fstat);
2140 /* Mark %st(1) through %st(7) as empty. Since we set the top of the
2141 floating-point register stack to 7, the appropriate value for the
2142 tag word is 0x3fff. */
2143 regcache_raw_write_unsigned (regcache, I387_FTAG_REGNUM (tdep), 0x3fff);
2147 /* See i387-tdep.h. */
2149 void
2150 i387_reset_bnd_regs (struct gdbarch *gdbarch, struct regcache *regcache)
2152 i386_gdbarch_tdep *tdep = gdbarch_tdep<i386_gdbarch_tdep> (gdbarch);
2154 if (I387_BND0R_REGNUM (tdep) > 0)
2156 gdb_byte bnd_buf[16];
2158 memset (bnd_buf, 0, 16);
2159 for (int i = 0; i < I387_NUM_BND_REGS; i++)
2160 regcache->raw_write (I387_BND0R_REGNUM (tdep) + i, bnd_buf);