1 /* Intel 387 floating point stuff.
3 Copyright (C) 1988-2023 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/>. */
26 #include "target-float.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. */
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. */
51 print_i387_ext (struct gdbarch
*gdbarch
,
52 const gdb_byte
*raw
, struct ui_file
*file
)
56 unsigned int exponent
;
57 unsigned long fraction
[2];
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)
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)
76 gdb_puts (" QNaN", file
);
79 gdb_puts (" SNaN", file
);
81 else if (exponent
< 0x7fff && exponent
> 0x0000 && integer
)
83 print_i387_value (gdbarch
, raw
, file
);
84 else if (exponent
== 0x0000)
86 /* Denormal or zero. */
87 print_i387_value (gdbarch
, raw
, file
);
90 /* Pseudo-denormal. */
91 gdb_puts (" Pseudo-denormal", file
);
92 else if (fraction
[0] || fraction
[1])
94 gdb_puts (" Denormal", file
);
98 gdb_puts (" Unsupported", file
);
101 /* Print the status word STATUS. If STATUS_P is false, then STATUS
105 print_i387_status_word (int status_p
,
106 unsigned int status
, struct ui_file
*file
)
108 gdb_printf (file
, "Status Word: ");
111 gdb_printf (file
, "%s\n", _("<unavailable>"));
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
);
136 " TOP: %d\n", ((status
>> 11) & 7));
139 /* Print the control word CONTROL. If CONTROL_P is false, then
140 CONTROL was unavailable. */
143 print_i387_control_word (int control_p
,
144 unsigned int control
, struct ui_file
*file
)
146 gdb_printf (file
, "Control Word: ");
149 gdb_printf (file
, "%s\n", _("<unavailable>"));
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)
168 gdb_puts ("Single Precision (24-bits)\n", file
);
171 gdb_puts ("Reserved\n", file
);
174 gdb_puts ("Double Precision (53-bits)\n", file
);
177 gdb_puts ("Extended Precision (64-bits)\n", file
);
181 gdb_puts (" RC: ", file
);
182 switch ((control
>> 10) & 3)
185 gdb_puts ("Round to nearest\n", file
);
188 gdb_puts ("Round down\n", file
);
191 gdb_puts ("Round up\n", file
);
194 gdb_puts ("Round toward zero\n", file
);
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. */
204 i387_print_float_info (struct gdbarch
*gdbarch
, struct ui_file
*file
,
205 frame_info_ptr frame
, const char *args
)
207 i386_gdbarch_tdep
*tdep
= gdbarch_tdep
<i386_gdbarch_tdep
> (gdbarch
);
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
);
248 top
= ((fstat
>> 11) & 7);
250 for (fpreg
= 7; fpreg
>= 0; fpreg
--)
252 struct value
*regval
;
257 gdb_printf (file
, "%sR%d: ", fpreg
== top
? "=>" : " ", fpreg
);
261 tag
= (ftag
>> (fpreg
* 2)) & 3;
266 gdb_puts ("Valid ", file
);
269 gdb_puts ("Zero ", file
);
272 gdb_puts ("Special ", file
);
275 gdb_puts ("Empty ", file
);
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
);
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",
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
,
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
)
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 (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;
366 /* Convert to TYPE. */
367 if (!get_frame_register_bytes (frame
, regnum
, 0,
368 gdb::make_array_view (from
,
369 register_size (gdbarch
,
371 optimizedp
, unavailablep
))
374 target_float_convert (from
, i387_ext_type (gdbarch
), to
, type
);
375 *optimizedp
= *unavailablep
= 0;
379 /* Write the contents FROM of a value of type TYPE into register
380 REGNUM in frame FRAME. */
383 i387_value_to_register (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."));
399 /* Convert from TYPE. */
400 target_float_convert (from
, type
, to
, i387_ext_type (gdbarch
));
401 put_frame_register (frame
, regnum
, to
);
405 /* Handle FSAVE and FXSAVE formats. */
407 /* At fsave_offset[REGNUM] you'll find the offset to the location in
408 the data structure used by the "fsave" instruction where GDB
409 register REGNUM is stored. */
411 static int fsave_offset
[] =
413 28 + 0 * 10, /* %st(0) ... */
420 28 + 7 * 10, /* ... %st(7). */
421 0, /* `fctrl' (16 bits). */
422 4, /* `fstat' (16 bits). */
423 8, /* `ftag' (16 bits). */
424 16, /* `fiseg' (16 bits). */
426 24, /* `foseg' (16 bits). */
428 18 /* `fop' (bottom 11 bits). */
431 #define FSAVE_ADDR(tdep, fsave, regnum) \
432 (fsave + fsave_offset[regnum - I387_ST0_REGNUM (tdep)])
435 /* Fill register REGNUM in REGCACHE with the appropriate value from
436 *FSAVE. This function masks off any of the reserved bits in
440 i387_supply_fsave (struct regcache
*regcache
, int regnum
, const void *fsave
)
442 struct gdbarch
*gdbarch
= regcache
->arch ();
443 i386_gdbarch_tdep
*tdep
= gdbarch_tdep
<i386_gdbarch_tdep
> (gdbarch
);
444 enum bfd_endian byte_order
= gdbarch_byte_order (gdbarch
);
445 const gdb_byte
*regs
= (const gdb_byte
*) fsave
;
448 gdb_assert (tdep
->st0_regnum
>= I386_ST0_REGNUM
);
450 for (i
= I387_ST0_REGNUM (tdep
); i
< I387_XMM0_REGNUM (tdep
); i
++)
451 if (regnum
== -1 || regnum
== i
)
455 regcache
->raw_supply (i
, NULL
);
459 /* Most of the FPU control registers occupy only 16 bits in the
460 fsave area. Give those a special treatment. */
461 if (i
>= I387_FCTRL_REGNUM (tdep
)
462 && i
!= I387_FIOFF_REGNUM (tdep
) && i
!= I387_FOOFF_REGNUM (tdep
))
466 memcpy (val
, FSAVE_ADDR (tdep
, regs
, i
), 2);
468 if (i
== I387_FOP_REGNUM (tdep
))
469 val
[1] &= ((1 << 3) - 1);
470 regcache
->raw_supply (i
, val
);
473 regcache
->raw_supply (i
, FSAVE_ADDR (tdep
, regs
, i
));
476 /* Provide dummy values for the SSE registers. */
477 for (i
= I387_XMM0_REGNUM (tdep
); i
< I387_MXCSR_REGNUM (tdep
); i
++)
478 if (regnum
== -1 || regnum
== i
)
479 regcache
->raw_supply (i
, NULL
);
480 if (regnum
== -1 || regnum
== I387_MXCSR_REGNUM (tdep
))
484 store_unsigned_integer (buf
, 4, byte_order
, I387_MXCSR_INIT_VAL
);
485 regcache
->raw_supply (I387_MXCSR_REGNUM (tdep
), buf
);
489 /* Fill register REGNUM (if it is a floating-point register) in *FSAVE
490 with the value from REGCACHE. If REGNUM is -1, do this for all
491 registers. This function doesn't touch any of the reserved bits in
495 i387_collect_fsave (const struct regcache
*regcache
, int regnum
, void *fsave
)
497 gdbarch
*arch
= regcache
->arch ();
498 i386_gdbarch_tdep
*tdep
= gdbarch_tdep
<i386_gdbarch_tdep
> (arch
);
499 gdb_byte
*regs
= (gdb_byte
*) fsave
;
502 gdb_assert (tdep
->st0_regnum
>= I386_ST0_REGNUM
);
504 for (i
= I387_ST0_REGNUM (tdep
); i
< I387_XMM0_REGNUM (tdep
); i
++)
505 if (regnum
== -1 || regnum
== i
)
507 /* Most of the FPU control registers occupy only 16 bits in
508 the fsave area. Give those a special treatment. */
509 if (i
>= I387_FCTRL_REGNUM (tdep
)
510 && i
!= I387_FIOFF_REGNUM (tdep
) && i
!= I387_FOOFF_REGNUM (tdep
))
514 regcache
->raw_collect (i
, buf
);
516 if (i
== I387_FOP_REGNUM (tdep
))
518 /* The opcode occupies only 11 bits. Make sure we
519 don't touch the other bits. */
520 buf
[1] &= ((1 << 3) - 1);
521 buf
[1] |= ((FSAVE_ADDR (tdep
, regs
, i
))[1] & ~((1 << 3) - 1));
523 memcpy (FSAVE_ADDR (tdep
, regs
, i
), buf
, 2);
526 regcache
->raw_collect (i
, FSAVE_ADDR (tdep
, regs
, i
));
531 /* At fxsave_offset[REGNUM] you'll find the offset to the location in
532 the data structure used by the "fxsave" instruction where GDB
533 register REGNUM is stored. */
535 static int fxsave_offset
[] =
537 32, /* %st(0) through ... */
544 144, /* ... %st(7) (80 bits each). */
545 0, /* `fctrl' (16 bits). */
546 2, /* `fstat' (16 bits). */
547 4, /* `ftag' (16 bits). */
548 12, /* `fiseg' (16 bits). */
550 20, /* `foseg' (16 bits). */
552 6, /* `fop' (bottom 11 bits). */
553 160 + 0 * 16, /* %xmm0 through ... */
568 160 + 15 * 16, /* ... %xmm15 (128 bits each). */
571 #define FXSAVE_ADDR(tdep, fxsave, regnum) \
572 (fxsave + fxsave_offset[regnum - I387_ST0_REGNUM (tdep)])
574 /* We made an unfortunate choice in putting %mxcsr after the SSE
575 registers %xmm0-%xmm7 instead of before, since it makes supporting
576 the registers %xmm8-%xmm15 on AMD64 a bit involved. Therefore we
577 don't include the offset for %mxcsr here above. */
579 #define FXSAVE_MXCSR_ADDR(fxsave) (fxsave + 24)
581 static int i387_tag (const gdb_byte
*raw
);
584 /* Fill register REGNUM in REGCACHE with the appropriate
585 floating-point or SSE register value from *FXSAVE. This function
586 masks off any of the reserved bits in *FXSAVE. */
589 i387_supply_fxsave (struct regcache
*regcache
, int regnum
, const void *fxsave
)
591 gdbarch
*arch
= regcache
->arch ();
592 i386_gdbarch_tdep
*tdep
= gdbarch_tdep
<i386_gdbarch_tdep
> (arch
);
593 const gdb_byte
*regs
= (const gdb_byte
*) fxsave
;
596 gdb_assert (tdep
->st0_regnum
>= I386_ST0_REGNUM
);
597 gdb_assert (tdep
->num_xmm_regs
> 0);
599 for (i
= I387_ST0_REGNUM (tdep
); i
< I387_MXCSR_REGNUM (tdep
); i
++)
600 if (regnum
== -1 || regnum
== i
)
604 regcache
->raw_supply (i
, NULL
);
608 /* Most of the FPU control registers occupy only 16 bits in
609 the fxsave area. Give those a special treatment. */
610 if (i
>= I387_FCTRL_REGNUM (tdep
) && i
< I387_XMM0_REGNUM (tdep
)
611 && i
!= I387_FIOFF_REGNUM (tdep
) && i
!= I387_FOOFF_REGNUM (tdep
))
615 memcpy (val
, FXSAVE_ADDR (tdep
, regs
, i
), 2);
617 if (i
== I387_FOP_REGNUM (tdep
))
618 val
[1] &= ((1 << 3) - 1);
619 else if (i
== I387_FTAG_REGNUM (tdep
))
621 /* The fxsave area contains a simplified version of
622 the tag word. We have to look at the actual 80-bit
623 FP data to recreate the traditional i387 tag word. */
625 unsigned long ftag
= 0;
629 top
= ((FXSAVE_ADDR (tdep
, regs
,
630 I387_FSTAT_REGNUM (tdep
)))[1] >> 3);
633 for (fpreg
= 7; fpreg
>= 0; fpreg
--)
637 if (val
[0] & (1 << fpreg
))
639 int thisreg
= (fpreg
+ 8 - top
) % 8
640 + I387_ST0_REGNUM (tdep
);
641 tag
= i387_tag (FXSAVE_ADDR (tdep
, regs
, thisreg
));
646 ftag
|= tag
<< (2 * fpreg
);
648 val
[0] = ftag
& 0xff;
649 val
[1] = (ftag
>> 8) & 0xff;
651 regcache
->raw_supply (i
, val
);
654 regcache
->raw_supply (i
, FXSAVE_ADDR (tdep
, regs
, i
));
657 if (regnum
== I387_MXCSR_REGNUM (tdep
) || regnum
== -1)
660 regcache
->raw_supply (I387_MXCSR_REGNUM (tdep
), NULL
);
662 regcache
->raw_supply (I387_MXCSR_REGNUM (tdep
),
663 FXSAVE_MXCSR_ADDR (regs
));
667 /* Fill register REGNUM (if it is a floating-point or SSE register) in
668 *FXSAVE with the value from REGCACHE. If REGNUM is -1, do this for
669 all registers. This function doesn't touch any of the reserved
673 i387_collect_fxsave (const struct regcache
*regcache
, int regnum
, void *fxsave
)
675 gdbarch
*arch
= regcache
->arch ();
676 i386_gdbarch_tdep
*tdep
= gdbarch_tdep
<i386_gdbarch_tdep
> (arch
);
677 gdb_byte
*regs
= (gdb_byte
*) fxsave
;
680 gdb_assert (tdep
->st0_regnum
>= I386_ST0_REGNUM
);
681 gdb_assert (tdep
->num_xmm_regs
> 0);
683 for (i
= I387_ST0_REGNUM (tdep
); i
< I387_MXCSR_REGNUM (tdep
); i
++)
684 if (regnum
== -1 || regnum
== i
)
686 /* Most of the FPU control registers occupy only 16 bits in
687 the fxsave area. Give those a special treatment. */
688 if (i
>= I387_FCTRL_REGNUM (tdep
) && i
< I387_XMM0_REGNUM (tdep
)
689 && i
!= I387_FIOFF_REGNUM (tdep
) && i
!= I387_FOOFF_REGNUM (tdep
))
693 regcache
->raw_collect (i
, buf
);
695 if (i
== I387_FOP_REGNUM (tdep
))
697 /* The opcode occupies only 11 bits. Make sure we
698 don't touch the other bits. */
699 buf
[1] &= ((1 << 3) - 1);
700 buf
[1] |= ((FXSAVE_ADDR (tdep
, regs
, i
))[1] & ~((1 << 3) - 1));
702 else if (i
== I387_FTAG_REGNUM (tdep
))
704 /* Converting back is much easier. */
709 ftag
= (buf
[1] << 8) | buf
[0];
713 for (fpreg
= 7; fpreg
>= 0; fpreg
--)
715 int tag
= (ftag
>> (fpreg
* 2)) & 3;
718 buf
[0] |= (1 << fpreg
);
721 memcpy (FXSAVE_ADDR (tdep
, regs
, i
), buf
, 2);
724 regcache
->raw_collect (i
, FXSAVE_ADDR (tdep
, regs
, i
));
727 if (regnum
== I387_MXCSR_REGNUM (tdep
) || regnum
== -1)
728 regcache
->raw_collect (I387_MXCSR_REGNUM (tdep
),
729 FXSAVE_MXCSR_ADDR (regs
));
732 /* `xstate_bv' is at byte offset 512. */
733 #define XSAVE_XSTATE_BV_ADDR(xsave) (xsave + 512)
735 /* At xsave_avxh_offset[REGNUM] you'll find the relative offset within
736 the AVX region of the XSAVE extended state where the upper 128bits
737 of GDB register YMM0 + REGNUM is stored. */
739 static int xsave_avxh_offset
[] =
741 0 * 16, /* Upper 128bit of %ymm0 through ... */
756 15 * 16 /* Upper 128bit of ... %ymm15 (128 bits each). */
759 #define XSAVE_AVXH_ADDR(tdep, xsave, regnum) \
760 (xsave + (tdep)->xsave_layout.avx_offset \
761 + xsave_avxh_offset[regnum - I387_YMM0H_REGNUM (tdep)])
763 /* At xsave_ymm_avx512_offset[REGNUM] you'll find the relative offset
764 within the ZMM region of the XSAVE extended state where the second
765 128bits of GDB register YMM16 + REGNUM is stored. */
767 static int xsave_ymm_avx512_offset
[] =
769 16 + 0 * 64, /* %ymm16 through... */
784 16 + 15 * 64 /* ... %ymm31 (128 bits each). */
787 #define XSAVE_YMM_AVX512_ADDR(tdep, xsave, regnum) \
788 (xsave + (tdep)->xsave_layout.zmm_offset \
789 + xsave_ymm_avx512_offset[regnum - I387_YMM16H_REGNUM (tdep)])
791 /* At xsave_xmm_avx512_offset[REGNUM] you'll find the relative offset
792 within the ZMM region of the XSAVE extended state where the first
793 128bits of GDB register XMM16 + REGNUM is stored. */
795 static int xsave_xmm_avx512_offset
[] =
797 0 * 64, /* %xmm16 through... */
812 15 * 64 /* ... %xmm31 (128 bits each). */
815 #define XSAVE_XMM_AVX512_ADDR(tdep, xsave, regnum) \
816 (xsave + (tdep)->xsave_layout.zmm_offset \
817 + xsave_xmm_avx512_offset[regnum - I387_XMM16_REGNUM (tdep)])
819 /* At xsave_bndregs_offset[REGNUM] you'll find the relative offset
820 within the BNDREGS region of the XSAVE extended state where the GDB
821 register BND0R + REGNUM is stored. */
823 static int xsave_bndregs_offset
[] = {
824 0 * 16, /* bnd0r...bnd3r registers. */
830 #define XSAVE_BNDREGS_ADDR(tdep, xsave, regnum) \
831 (xsave + (tdep)->xsave_layout.bndregs_offset \
832 + xsave_bndregs_offset[regnum - I387_BND0R_REGNUM (tdep)])
834 static int xsave_bndcfg_offset
[] = {
835 0 * 8, /* bndcfg ... bndstatus. */
839 #define XSAVE_BNDCFG_ADDR(tdep, xsave, regnum) \
840 (xsave + (tdep)->xsave_layout.bndcfg_offset \
841 + xsave_bndcfg_offset[regnum - I387_BNDCFGU_REGNUM (tdep)])
843 /* At xsave_avx512_k_offset[REGNUM] you'll find the relative offset
844 within the K region of the XSAVE extended state where the AVX512
845 opmask register K0 + REGNUM is stored. */
847 static int xsave_avx512_k_offset
[] =
849 0 * 8, /* %k0 through... */
856 7 * 8 /* %k7 (64 bits each). */
859 #define XSAVE_AVX512_K_ADDR(tdep, xsave, regnum) \
860 (xsave + (tdep)->xsave_layout.k_offset \
861 + xsave_avx512_k_offset[regnum - I387_K0_REGNUM (tdep)])
864 /* At xsave_avx512_zmm0_h_offset[REGNUM] you find the relative offset
865 within the ZMM_H region of the XSAVE extended state where the upper
866 256bits of the GDB register ZMM0 + REGNUM is stored. */
868 static int xsave_avx512_zmm0_h_offset
[] =
870 0 * 32, /* Upper 256bit of %zmmh0 through... */
885 15 * 32 /* Upper 256bit of... %zmmh15 (256 bits each). */
888 #define XSAVE_AVX512_ZMM0_H_ADDR(tdep, xsave, regnum) \
889 (xsave + (tdep)->xsave_layout.zmm_h_offset \
890 + xsave_avx512_zmm0_h_offset[regnum - I387_ZMM0H_REGNUM (tdep)])
892 /* At xsave_avx512_zmm16_h_offset[REGNUM] you find the relative offset
893 within the ZMM_H region of the XSAVE extended state where the upper
894 256bits of the GDB register ZMM16 + REGNUM is stored. */
896 static int xsave_avx512_zmm16_h_offset
[] =
898 32 + 0 * 64, /* Upper 256bit of... %zmmh16 (256 bits each). */
913 32 + 15 * 64 /* Upper 256bit of... %zmmh31 (256 bits each). */
916 #define XSAVE_AVX512_ZMM16_H_ADDR(tdep, xsave, regnum) \
917 (xsave + (tdep)->xsave_layout.zmm_offset \
918 + xsave_avx512_zmm16_h_offset[regnum - I387_ZMM16H_REGNUM (tdep)])
920 /* At xsave_pkeys_offset[REGNUM] you'll find the relative offset
921 within the PKEYS region of the XSAVE extended state where the PKRU
922 register is stored. */
924 static int xsave_pkeys_offset
[] =
926 0 * 8 /* %pkru (64 bits in XSTATE, 32-bit actually used by
927 instructions and applications). */
930 #define XSAVE_PKEYS_ADDR(tdep, xsave, regnum) \
931 (xsave + (tdep)->xsave_layout.pkru_offset \
932 + xsave_pkeys_offset[regnum - I387_PKRU_REGNUM (tdep)])
935 /* See i387-tdep.h. */
938 i387_guess_xsave_layout (uint64_t xcr0
, size_t xsave_size
,
939 x86_xsave_layout
&layout
)
941 if (HAS_PKRU (xcr0
) && xsave_size
== 2696)
943 /* Intel CPUs supporting PKRU. */
944 layout
.avx_offset
= 576;
945 layout
.bndregs_offset
= 960;
946 layout
.bndcfg_offset
= 1024;
947 layout
.k_offset
= 1088;
948 layout
.zmm_h_offset
= 1152;
949 layout
.zmm_offset
= 1664;
950 layout
.pkru_offset
= 2688;
952 else if (HAS_PKRU (xcr0
) && xsave_size
== 2440)
954 /* AMD CPUs supporting PKRU. */
955 layout
.avx_offset
= 576;
956 layout
.k_offset
= 832;
957 layout
.zmm_h_offset
= 896;
958 layout
.zmm_offset
= 1408;
959 layout
.pkru_offset
= 2432;
961 else if (HAS_AVX512 (xcr0
) && xsave_size
== 2688)
963 /* Intel CPUs supporting AVX512. */
964 layout
.avx_offset
= 576;
965 layout
.bndregs_offset
= 960;
966 layout
.bndcfg_offset
= 1024;
967 layout
.k_offset
= 1088;
968 layout
.zmm_h_offset
= 1152;
969 layout
.zmm_offset
= 1664;
971 else if (HAS_MPX (xcr0
) && xsave_size
== 1088)
973 /* Intel CPUs supporting MPX. */
974 layout
.avx_offset
= 576;
975 layout
.bndregs_offset
= 960;
976 layout
.bndcfg_offset
= 1024;
978 else if (HAS_AVX (xcr0
) && xsave_size
== 832)
980 /* Intel and AMD CPUs supporting AVX. */
981 layout
.avx_offset
= 576;
986 layout
.sizeof_xsave
= xsave_size
;
990 /* Extract from XSAVE a bitset of the features that are available on the
991 target, but which have not yet been enabled. */
994 i387_xsave_get_clear_bv (struct gdbarch
*gdbarch
, const void *xsave
)
996 enum bfd_endian byte_order
= gdbarch_byte_order (gdbarch
);
997 const gdb_byte
*regs
= (const gdb_byte
*) xsave
;
998 i386_gdbarch_tdep
*tdep
= gdbarch_tdep
<i386_gdbarch_tdep
> (gdbarch
);
1000 /* Get `xstat_bv'. The supported bits in `xstat_bv' are 8 bytes. */
1001 ULONGEST xstate_bv
= extract_unsigned_integer (XSAVE_XSTATE_BV_ADDR (regs
),
1004 /* Clear part in vector registers if its bit in xstat_bv is zero. */
1005 ULONGEST clear_bv
= (~(xstate_bv
)) & tdep
->xcr0
;
1010 /* Similar to i387_supply_fxsave, but use XSAVE extended state. */
1013 i387_supply_xsave (struct regcache
*regcache
, int regnum
,
1016 struct gdbarch
*gdbarch
= regcache
->arch ();
1017 enum bfd_endian byte_order
= gdbarch_byte_order (gdbarch
);
1018 i386_gdbarch_tdep
*tdep
= gdbarch_tdep
<i386_gdbarch_tdep
> (gdbarch
);
1019 const gdb_byte
*regs
= (const gdb_byte
*) xsave
;
1021 /* In 64-bit mode the split between "low" and "high" ZMM registers is at
1022 ZMM16. Outside of 64-bit mode there are no "high" ZMM registers at all.
1023 Precalculate the number to be used for the split point, with the all
1024 registers in the "low" portion outside of 64-bit mode. */
1025 unsigned int zmm_endlo_regnum
= I387_ZMM0H_REGNUM (tdep
)
1026 + std::min (tdep
->num_zmm_regs
, 16);
1028 static const gdb_byte zero
[I386_MAX_REGISTER_SIZE
] = { 0 };
1038 avx512_zmm0_h
= 0x40,
1039 avx512_zmm16_h
= 0x80,
1040 avx512_ymmh_avx512
= 0x100,
1041 avx512_xmm_avx512
= 0x200,
1043 all
= x87
| sse
| avxh
| bndregs
| bndcfg
| avx512_k
| avx512_zmm0_h
1044 | avx512_zmm16_h
| avx512_ymmh_avx512
| avx512_xmm_avx512
| pkeys
1047 gdb_assert (regs
!= NULL
);
1048 gdb_assert (tdep
->st0_regnum
>= I386_ST0_REGNUM
);
1049 gdb_assert (tdep
->num_xmm_regs
> 0);
1053 else if (regnum
>= I387_PKRU_REGNUM (tdep
)
1054 && regnum
< I387_PKEYSEND_REGNUM (tdep
))
1056 else if (regnum
>= I387_ZMM0H_REGNUM (tdep
)
1057 && regnum
< I387_ZMM16H_REGNUM (tdep
))
1058 regclass
= avx512_zmm0_h
;
1059 else if (regnum
>= I387_ZMM16H_REGNUM (tdep
)
1060 && regnum
< I387_ZMMENDH_REGNUM (tdep
))
1061 regclass
= avx512_zmm16_h
;
1062 else if (regnum
>= I387_K0_REGNUM (tdep
)
1063 && regnum
< I387_KEND_REGNUM (tdep
))
1064 regclass
= avx512_k
;
1065 else if (regnum
>= I387_YMM16H_REGNUM (tdep
)
1066 && regnum
< I387_YMMH_AVX512_END_REGNUM (tdep
))
1067 regclass
= avx512_ymmh_avx512
;
1068 else if (regnum
>= I387_XMM16_REGNUM (tdep
)
1069 && regnum
< I387_XMM_AVX512_END_REGNUM (tdep
))
1070 regclass
= avx512_xmm_avx512
;
1071 else if (regnum
>= I387_YMM0H_REGNUM (tdep
)
1072 && regnum
< I387_YMMENDH_REGNUM (tdep
))
1074 else if (regnum
>= I387_BND0R_REGNUM (tdep
)
1075 && regnum
< I387_BNDCFGU_REGNUM (tdep
))
1077 else if (regnum
>= I387_BNDCFGU_REGNUM (tdep
)
1078 && regnum
< I387_MPXEND_REGNUM (tdep
))
1080 else if (regnum
>= I387_XMM0_REGNUM (tdep
)
1081 && regnum
< I387_MXCSR_REGNUM (tdep
))
1083 else if (regnum
>= I387_ST0_REGNUM (tdep
)
1084 && regnum
< I387_FCTRL_REGNUM (tdep
))
1089 clear_bv
= i387_xsave_get_clear_bv (gdbarch
, xsave
);
1091 /* With the delayed xsave mechanism, in between the program
1092 starting, and the program accessing the vector registers for the
1093 first time, the register's values are invalid. The kernel
1094 initializes register states to zero when they are set the first
1095 time in a program. This means that from the user-space programs'
1096 perspective, it's the same as if the registers have always been
1097 zero from the start of the program. Therefore, the debugger
1098 should provide the same illusion to the user. */
1106 if ((clear_bv
& X86_XSTATE_PKRU
))
1107 regcache
->raw_supply (regnum
, zero
);
1109 regcache
->raw_supply (regnum
, XSAVE_PKEYS_ADDR (tdep
, regs
, regnum
));
1113 if ((clear_bv
& X86_XSTATE_ZMM_H
))
1114 regcache
->raw_supply (regnum
, zero
);
1116 regcache
->raw_supply (regnum
,
1117 XSAVE_AVX512_ZMM0_H_ADDR (tdep
, regs
, regnum
));
1120 case avx512_zmm16_h
:
1121 if ((clear_bv
& X86_XSTATE_ZMM
))
1122 regcache
->raw_supply (regnum
, zero
);
1124 regcache
->raw_supply (regnum
,
1125 XSAVE_AVX512_ZMM16_H_ADDR (tdep
, regs
, regnum
));
1129 if ((clear_bv
& X86_XSTATE_K
))
1130 regcache
->raw_supply (regnum
, zero
);
1132 regcache
->raw_supply (regnum
, XSAVE_AVX512_K_ADDR (tdep
, regs
, regnum
));
1135 case avx512_ymmh_avx512
:
1136 if ((clear_bv
& X86_XSTATE_ZMM
))
1137 regcache
->raw_supply (regnum
, zero
);
1139 regcache
->raw_supply (regnum
,
1140 XSAVE_YMM_AVX512_ADDR (tdep
, regs
, regnum
));
1143 case avx512_xmm_avx512
:
1144 if ((clear_bv
& X86_XSTATE_ZMM
))
1145 regcache
->raw_supply (regnum
, zero
);
1147 regcache
->raw_supply (regnum
,
1148 XSAVE_XMM_AVX512_ADDR (tdep
, regs
, regnum
));
1152 if ((clear_bv
& X86_XSTATE_AVX
))
1153 regcache
->raw_supply (regnum
, zero
);
1155 regcache
->raw_supply (regnum
, XSAVE_AVXH_ADDR (tdep
, regs
, regnum
));
1159 if ((clear_bv
& X86_XSTATE_BNDCFG
))
1160 regcache
->raw_supply (regnum
, zero
);
1162 regcache
->raw_supply (regnum
, XSAVE_BNDCFG_ADDR (tdep
, regs
, regnum
));
1166 if ((clear_bv
& X86_XSTATE_BNDREGS
))
1167 regcache
->raw_supply (regnum
, zero
);
1169 regcache
->raw_supply (regnum
, XSAVE_BNDREGS_ADDR (tdep
, regs
, regnum
));
1173 if ((clear_bv
& X86_XSTATE_SSE
))
1174 regcache
->raw_supply (regnum
, zero
);
1176 regcache
->raw_supply (regnum
, FXSAVE_ADDR (tdep
, regs
, regnum
));
1180 if ((clear_bv
& X86_XSTATE_X87
))
1181 regcache
->raw_supply (regnum
, zero
);
1183 regcache
->raw_supply (regnum
, FXSAVE_ADDR (tdep
, regs
, regnum
));
1187 /* Handle PKEYS registers. */
1188 if ((tdep
->xcr0
& X86_XSTATE_PKRU
))
1190 if ((clear_bv
& X86_XSTATE_PKRU
))
1192 for (i
= I387_PKRU_REGNUM (tdep
);
1193 i
< I387_PKEYSEND_REGNUM (tdep
);
1195 regcache
->raw_supply (i
, zero
);
1199 for (i
= I387_PKRU_REGNUM (tdep
);
1200 i
< I387_PKEYSEND_REGNUM (tdep
);
1202 regcache
->raw_supply (i
, XSAVE_PKEYS_ADDR (tdep
, regs
, i
));
1206 /* Handle the upper halves of the low 8/16 ZMM registers. */
1207 if ((tdep
->xcr0
& X86_XSTATE_ZMM_H
))
1209 if ((clear_bv
& X86_XSTATE_ZMM_H
))
1211 for (i
= I387_ZMM0H_REGNUM (tdep
); i
< zmm_endlo_regnum
; i
++)
1212 regcache
->raw_supply (i
, zero
);
1216 for (i
= I387_ZMM0H_REGNUM (tdep
); i
< zmm_endlo_regnum
; i
++)
1217 regcache
->raw_supply (i
,
1218 XSAVE_AVX512_ZMM0_H_ADDR (tdep
, regs
, i
));
1222 /* Handle AVX512 OpMask registers. */
1223 if ((tdep
->xcr0
& X86_XSTATE_K
))
1225 if ((clear_bv
& X86_XSTATE_K
))
1227 for (i
= I387_K0_REGNUM (tdep
);
1228 i
< I387_KEND_REGNUM (tdep
);
1230 regcache
->raw_supply (i
, zero
);
1234 for (i
= I387_K0_REGNUM (tdep
);
1235 i
< I387_KEND_REGNUM (tdep
);
1237 regcache
->raw_supply (i
, XSAVE_AVX512_K_ADDR (tdep
, regs
, i
));
1241 /* Handle the upper 16 ZMM/YMM/XMM registers (if any). */
1242 if ((tdep
->xcr0
& X86_XSTATE_ZMM
))
1244 if ((clear_bv
& X86_XSTATE_ZMM
))
1246 for (i
= I387_ZMM16H_REGNUM (tdep
);
1247 i
< I387_ZMMENDH_REGNUM (tdep
); i
++)
1248 regcache
->raw_supply (i
, zero
);
1249 for (i
= I387_YMM16H_REGNUM (tdep
);
1250 i
< I387_YMMH_AVX512_END_REGNUM (tdep
);
1252 regcache
->raw_supply (i
, zero
);
1253 for (i
= I387_XMM16_REGNUM (tdep
);
1254 i
< I387_XMM_AVX512_END_REGNUM (tdep
);
1256 regcache
->raw_supply (i
, zero
);
1260 for (i
= I387_ZMM16H_REGNUM (tdep
);
1261 i
< I387_ZMMENDH_REGNUM (tdep
); i
++)
1262 regcache
->raw_supply (i
,
1263 XSAVE_AVX512_ZMM16_H_ADDR (tdep
, regs
, i
));
1264 for (i
= I387_YMM16H_REGNUM (tdep
);
1265 i
< I387_YMMH_AVX512_END_REGNUM (tdep
);
1267 regcache
->raw_supply (i
, XSAVE_YMM_AVX512_ADDR (tdep
, regs
, i
));
1268 for (i
= I387_XMM16_REGNUM (tdep
);
1269 i
< I387_XMM_AVX512_END_REGNUM (tdep
);
1271 regcache
->raw_supply (i
, XSAVE_XMM_AVX512_ADDR (tdep
, regs
, i
));
1274 /* Handle the upper YMM registers. */
1275 if ((tdep
->xcr0
& X86_XSTATE_AVX
))
1277 if ((clear_bv
& X86_XSTATE_AVX
))
1279 for (i
= I387_YMM0H_REGNUM (tdep
);
1280 i
< I387_YMMENDH_REGNUM (tdep
);
1282 regcache
->raw_supply (i
, zero
);
1286 for (i
= I387_YMM0H_REGNUM (tdep
);
1287 i
< I387_YMMENDH_REGNUM (tdep
);
1289 regcache
->raw_supply (i
, XSAVE_AVXH_ADDR (tdep
, regs
, i
));
1293 /* Handle the MPX registers. */
1294 if ((tdep
->xcr0
& X86_XSTATE_BNDREGS
))
1296 if (clear_bv
& X86_XSTATE_BNDREGS
)
1298 for (i
= I387_BND0R_REGNUM (tdep
);
1299 i
< I387_BNDCFGU_REGNUM (tdep
); i
++)
1300 regcache
->raw_supply (i
, zero
);
1304 for (i
= I387_BND0R_REGNUM (tdep
);
1305 i
< I387_BNDCFGU_REGNUM (tdep
); i
++)
1306 regcache
->raw_supply (i
, XSAVE_BNDREGS_ADDR (tdep
, regs
, i
));
1310 /* Handle the MPX registers. */
1311 if ((tdep
->xcr0
& X86_XSTATE_BNDCFG
))
1313 if (clear_bv
& X86_XSTATE_BNDCFG
)
1315 for (i
= I387_BNDCFGU_REGNUM (tdep
);
1316 i
< I387_MPXEND_REGNUM (tdep
); i
++)
1317 regcache
->raw_supply (i
, zero
);
1321 for (i
= I387_BNDCFGU_REGNUM (tdep
);
1322 i
< I387_MPXEND_REGNUM (tdep
); i
++)
1323 regcache
->raw_supply (i
, XSAVE_BNDCFG_ADDR (tdep
, regs
, i
));
1327 /* Handle the XMM registers. */
1328 if ((tdep
->xcr0
& X86_XSTATE_SSE
))
1330 if ((clear_bv
& X86_XSTATE_SSE
))
1332 for (i
= I387_XMM0_REGNUM (tdep
);
1333 i
< I387_MXCSR_REGNUM (tdep
);
1335 regcache
->raw_supply (i
, zero
);
1339 for (i
= I387_XMM0_REGNUM (tdep
);
1340 i
< I387_MXCSR_REGNUM (tdep
); i
++)
1341 regcache
->raw_supply (i
, FXSAVE_ADDR (tdep
, regs
, i
));
1345 /* Handle the x87 registers. */
1346 if ((tdep
->xcr0
& X86_XSTATE_X87
))
1348 if ((clear_bv
& X86_XSTATE_X87
))
1350 for (i
= I387_ST0_REGNUM (tdep
);
1351 i
< I387_FCTRL_REGNUM (tdep
);
1353 regcache
->raw_supply (i
, zero
);
1357 for (i
= I387_ST0_REGNUM (tdep
);
1358 i
< I387_FCTRL_REGNUM (tdep
);
1360 regcache
->raw_supply (i
, FXSAVE_ADDR (tdep
, regs
, i
));
1366 /* Only handle x87 control registers. */
1367 for (i
= I387_FCTRL_REGNUM (tdep
); i
< I387_XMM0_REGNUM (tdep
); i
++)
1368 if (regnum
== -1 || regnum
== i
)
1370 if (clear_bv
& X86_XSTATE_X87
)
1372 if (i
== I387_FCTRL_REGNUM (tdep
))
1376 store_unsigned_integer (buf
, 4, byte_order
,
1377 I387_FCTRL_INIT_VAL
);
1378 regcache
->raw_supply (i
, buf
);
1380 else if (i
== I387_FTAG_REGNUM (tdep
))
1384 store_unsigned_integer (buf
, 4, byte_order
, 0xffff);
1385 regcache
->raw_supply (i
, buf
);
1388 regcache
->raw_supply (i
, zero
);
1390 /* Most of the FPU control registers occupy only 16 bits in
1391 the xsave extended state. Give those a special treatment. */
1392 else if (i
!= I387_FIOFF_REGNUM (tdep
)
1393 && i
!= I387_FOOFF_REGNUM (tdep
))
1397 memcpy (val
, FXSAVE_ADDR (tdep
, regs
, i
), 2);
1398 val
[2] = val
[3] = 0;
1399 if (i
== I387_FOP_REGNUM (tdep
))
1400 val
[1] &= ((1 << 3) - 1);
1401 else if (i
== I387_FTAG_REGNUM (tdep
))
1403 /* The fxsave area contains a simplified version of
1404 the tag word. We have to look at the actual 80-bit
1405 FP data to recreate the traditional i387 tag word. */
1407 unsigned long ftag
= 0;
1411 top
= ((FXSAVE_ADDR (tdep
, regs
,
1412 I387_FSTAT_REGNUM (tdep
)))[1] >> 3);
1415 for (fpreg
= 7; fpreg
>= 0; fpreg
--)
1419 if (val
[0] & (1 << fpreg
))
1421 int thisreg
= (fpreg
+ 8 - top
) % 8
1422 + I387_ST0_REGNUM (tdep
);
1423 tag
= i387_tag (FXSAVE_ADDR (tdep
, regs
, thisreg
));
1426 tag
= 3; /* Empty */
1428 ftag
|= tag
<< (2 * fpreg
);
1430 val
[0] = ftag
& 0xff;
1431 val
[1] = (ftag
>> 8) & 0xff;
1433 regcache
->raw_supply (i
, val
);
1436 regcache
->raw_supply (i
, FXSAVE_ADDR (tdep
, regs
, i
));
1439 if (regnum
== I387_MXCSR_REGNUM (tdep
) || regnum
== -1)
1441 /* The MXCSR register is placed into the xsave buffer if either the
1442 AVX or SSE features are enabled. */
1443 if ((clear_bv
& (X86_XSTATE_AVX
| X86_XSTATE_SSE
))
1444 == (X86_XSTATE_AVX
| X86_XSTATE_SSE
))
1448 store_unsigned_integer (buf
, 4, byte_order
, I387_MXCSR_INIT_VAL
);
1449 regcache
->raw_supply (I387_MXCSR_REGNUM (tdep
), buf
);
1452 regcache
->raw_supply (I387_MXCSR_REGNUM (tdep
),
1453 FXSAVE_MXCSR_ADDR (regs
));
1457 /* Similar to i387_collect_fxsave, but use XSAVE extended state. */
1460 i387_collect_xsave (const struct regcache
*regcache
, int regnum
,
1461 void *xsave
, int gcore
)
1463 struct gdbarch
*gdbarch
= regcache
->arch ();
1464 enum bfd_endian byte_order
= gdbarch_byte_order (gdbarch
);
1465 i386_gdbarch_tdep
*tdep
= gdbarch_tdep
<i386_gdbarch_tdep
> (gdbarch
);
1466 gdb_byte
*p
, *regs
= (gdb_byte
*) xsave
;
1467 gdb_byte raw
[I386_MAX_REGISTER_SIZE
];
1468 ULONGEST initial_xstate_bv
, clear_bv
, xstate_bv
= 0;
1470 /* See the comment in i387_supply_xsave(). */
1471 unsigned int zmm_endlo_regnum
= I387_ZMM0H_REGNUM (tdep
)
1472 + std::min (tdep
->num_zmm_regs
, 16);
1475 x87_ctrl_or_mxcsr
= 0x1,
1482 avx512_zmm0_h
= 0x80,
1483 avx512_zmm16_h
= 0x100,
1484 avx512_ymmh_avx512
= 0x200,
1485 avx512_xmm_avx512
= 0x400,
1487 all
= x87
| sse
| avxh
| bndregs
| bndcfg
| avx512_k
| avx512_zmm0_h
1488 | avx512_zmm16_h
| avx512_ymmh_avx512
| avx512_xmm_avx512
| pkeys
1491 gdb_assert (tdep
->st0_regnum
>= I386_ST0_REGNUM
);
1492 gdb_assert (tdep
->num_xmm_regs
> 0);
1496 else if (regnum
>= I387_PKRU_REGNUM (tdep
)
1497 && regnum
< I387_PKEYSEND_REGNUM (tdep
))
1499 else if (regnum
>= I387_ZMM0H_REGNUM (tdep
)
1500 && regnum
< I387_ZMM16H_REGNUM (tdep
))
1501 regclass
= avx512_zmm0_h
;
1502 else if (regnum
>= I387_ZMM16H_REGNUM (tdep
)
1503 && regnum
< I387_ZMMENDH_REGNUM (tdep
))
1504 regclass
= avx512_zmm16_h
;
1505 else if (regnum
>= I387_K0_REGNUM (tdep
)
1506 && regnum
< I387_KEND_REGNUM (tdep
))
1507 regclass
= avx512_k
;
1508 else if (regnum
>= I387_YMM16H_REGNUM (tdep
)
1509 && regnum
< I387_YMMH_AVX512_END_REGNUM (tdep
))
1510 regclass
= avx512_ymmh_avx512
;
1511 else if (regnum
>= I387_XMM16_REGNUM (tdep
)
1512 && regnum
< I387_XMM_AVX512_END_REGNUM (tdep
))
1513 regclass
= avx512_xmm_avx512
;
1514 else if (regnum
>= I387_YMM0H_REGNUM (tdep
)
1515 && regnum
< I387_YMMENDH_REGNUM (tdep
))
1517 else if (regnum
>= I387_BND0R_REGNUM (tdep
)
1518 && regnum
< I387_BNDCFGU_REGNUM (tdep
))
1520 else if (regnum
>= I387_BNDCFGU_REGNUM (tdep
)
1521 && regnum
< I387_MPXEND_REGNUM (tdep
))
1523 else if (regnum
>= I387_XMM0_REGNUM (tdep
)
1524 && regnum
< I387_MXCSR_REGNUM (tdep
))
1526 else if (regnum
>= I387_ST0_REGNUM (tdep
)
1527 && regnum
< I387_FCTRL_REGNUM (tdep
))
1529 else if ((regnum
>= I387_FCTRL_REGNUM (tdep
)
1530 && regnum
< I387_XMM0_REGNUM (tdep
))
1531 || regnum
== I387_MXCSR_REGNUM (tdep
))
1532 regclass
= x87_ctrl_or_mxcsr
;
1534 internal_error (_("invalid i387 regnum %d"), regnum
);
1538 /* Clear XSAVE extended state. */
1539 memset (regs
, 0, tdep
->xsave_layout
.sizeof_xsave
);
1541 /* Update XCR0 and `xstate_bv' with XCR0 for gcore. */
1542 if (tdep
->xsave_xcr0_offset
!= -1)
1543 memcpy (regs
+ tdep
->xsave_xcr0_offset
, &tdep
->xcr0
, 8);
1544 memcpy (XSAVE_XSTATE_BV_ADDR (regs
), &tdep
->xcr0
, 8);
1547 /* The supported bits in `xstat_bv' are 8 bytes. */
1548 initial_xstate_bv
= extract_unsigned_integer (XSAVE_XSTATE_BV_ADDR (regs
),
1550 clear_bv
= (~(initial_xstate_bv
)) & tdep
->xcr0
;
1552 /* The XSAVE buffer was filled lazily by the kernel. Only those
1553 features that are enabled were written into the buffer, disabled
1554 features left the buffer uninitialised. In order to identify if any
1555 registers have changed we will be comparing the register cache
1556 version to the version in the XSAVE buffer, it is important then that
1557 at this point we initialise to the default values any features in
1558 XSAVE that are not yet initialised.
1560 This could be made more efficient, we know which features (from
1561 REGNUM) we will be potentially updating, and could limit ourselves to
1562 only clearing that feature. However, the extra complexity does not
1563 seem justified at this point. */
1566 if ((clear_bv
& X86_XSTATE_PKRU
))
1567 for (i
= I387_PKRU_REGNUM (tdep
);
1568 i
< I387_PKEYSEND_REGNUM (tdep
); i
++)
1569 memset (XSAVE_PKEYS_ADDR (tdep
, regs
, i
), 0, 4);
1571 if ((clear_bv
& X86_XSTATE_BNDREGS
))
1572 for (i
= I387_BND0R_REGNUM (tdep
);
1573 i
< I387_BNDCFGU_REGNUM (tdep
); i
++)
1574 memset (XSAVE_BNDREGS_ADDR (tdep
, regs
, i
), 0, 16);
1576 if ((clear_bv
& X86_XSTATE_BNDCFG
))
1577 for (i
= I387_BNDCFGU_REGNUM (tdep
);
1578 i
< I387_MPXEND_REGNUM (tdep
); i
++)
1579 memset (XSAVE_BNDCFG_ADDR (tdep
, regs
, i
), 0, 8);
1581 if ((clear_bv
& X86_XSTATE_ZMM_H
))
1582 for (i
= I387_ZMM0H_REGNUM (tdep
); i
< zmm_endlo_regnum
; i
++)
1583 memset (XSAVE_AVX512_ZMM0_H_ADDR (tdep
, regs
, i
), 0, 32);
1585 if ((clear_bv
& X86_XSTATE_K
))
1586 for (i
= I387_K0_REGNUM (tdep
);
1587 i
< I387_KEND_REGNUM (tdep
); i
++)
1588 memset (XSAVE_AVX512_K_ADDR (tdep
, regs
, i
), 0, 8);
1590 if ((clear_bv
& X86_XSTATE_ZMM
))
1592 for (i
= I387_ZMM16H_REGNUM (tdep
); i
< I387_ZMMENDH_REGNUM (tdep
);
1594 memset (XSAVE_AVX512_ZMM16_H_ADDR (tdep
, regs
, i
), 0, 32);
1595 for (i
= I387_YMM16H_REGNUM (tdep
);
1596 i
< I387_YMMH_AVX512_END_REGNUM (tdep
); i
++)
1597 memset (XSAVE_YMM_AVX512_ADDR (tdep
, regs
, i
), 0, 16);
1598 for (i
= I387_XMM16_REGNUM (tdep
);
1599 i
< I387_XMM_AVX512_END_REGNUM (tdep
); i
++)
1600 memset (XSAVE_XMM_AVX512_ADDR (tdep
, regs
, i
), 0, 16);
1603 if ((clear_bv
& X86_XSTATE_AVX
))
1604 for (i
= I387_YMM0H_REGNUM (tdep
);
1605 i
< I387_YMMENDH_REGNUM (tdep
); i
++)
1606 memset (XSAVE_AVXH_ADDR (tdep
, regs
, i
), 0, 16);
1608 if ((clear_bv
& X86_XSTATE_SSE
))
1609 for (i
= I387_XMM0_REGNUM (tdep
);
1610 i
< I387_MXCSR_REGNUM (tdep
); i
++)
1611 memset (FXSAVE_ADDR (tdep
, regs
, i
), 0, 16);
1613 /* The mxcsr register is written into the xsave buffer if either AVX
1614 or SSE is enabled, so only clear it if both of those features
1615 require clearing. */
1616 if ((clear_bv
& (X86_XSTATE_AVX
| X86_XSTATE_SSE
))
1617 == (X86_XSTATE_AVX
| X86_XSTATE_SSE
))
1618 store_unsigned_integer (FXSAVE_MXCSR_ADDR (regs
), 2, byte_order
,
1619 I387_MXCSR_INIT_VAL
);
1621 if ((clear_bv
& X86_XSTATE_X87
))
1623 for (i
= I387_ST0_REGNUM (tdep
);
1624 i
< I387_FCTRL_REGNUM (tdep
); i
++)
1625 memset (FXSAVE_ADDR (tdep
, regs
, i
), 0, 10);
1627 for (i
= I387_FCTRL_REGNUM (tdep
);
1628 i
< I387_XMM0_REGNUM (tdep
); i
++)
1630 if (i
== I387_FCTRL_REGNUM (tdep
))
1631 store_unsigned_integer (FXSAVE_ADDR (tdep
, regs
, i
), 2,
1632 byte_order
, I387_FCTRL_INIT_VAL
);
1634 memset (FXSAVE_ADDR (tdep
, regs
, i
), 0,
1635 regcache_register_size (regcache
, i
));
1640 if (regclass
== all
)
1642 /* Check if any PKEYS registers are changed. */
1643 if ((tdep
->xcr0
& X86_XSTATE_PKRU
))
1644 for (i
= I387_PKRU_REGNUM (tdep
);
1645 i
< I387_PKEYSEND_REGNUM (tdep
); i
++)
1647 regcache
->raw_collect (i
, raw
);
1648 p
= XSAVE_PKEYS_ADDR (tdep
, regs
, i
);
1649 if (memcmp (raw
, p
, 4) != 0)
1651 xstate_bv
|= X86_XSTATE_PKRU
;
1656 /* Check if any ZMMH registers are changed. */
1657 if ((tdep
->xcr0
& X86_XSTATE_ZMM
))
1658 for (i
= I387_ZMM16H_REGNUM (tdep
);
1659 i
< I387_ZMMENDH_REGNUM (tdep
); i
++)
1661 regcache
->raw_collect (i
, raw
);
1662 p
= XSAVE_AVX512_ZMM16_H_ADDR (tdep
, regs
, i
);
1663 if (memcmp (raw
, p
, 32) != 0)
1665 xstate_bv
|= X86_XSTATE_ZMM
;
1666 memcpy (p
, raw
, 32);
1670 if ((tdep
->xcr0
& X86_XSTATE_ZMM_H
))
1671 for (i
= I387_ZMM0H_REGNUM (tdep
); i
< zmm_endlo_regnum
; i
++)
1673 regcache
->raw_collect (i
, raw
);
1674 p
= XSAVE_AVX512_ZMM0_H_ADDR (tdep
, regs
, i
);
1675 if (memcmp (raw
, p
, 32) != 0)
1677 xstate_bv
|= X86_XSTATE_ZMM_H
;
1678 memcpy (p
, raw
, 32);
1682 /* Check if any K registers are changed. */
1683 if ((tdep
->xcr0
& X86_XSTATE_K
))
1684 for (i
= I387_K0_REGNUM (tdep
);
1685 i
< I387_KEND_REGNUM (tdep
); i
++)
1687 regcache
->raw_collect (i
, raw
);
1688 p
= XSAVE_AVX512_K_ADDR (tdep
, regs
, i
);
1689 if (memcmp (raw
, p
, 8) != 0)
1691 xstate_bv
|= X86_XSTATE_K
;
1696 /* Check if any XMM or upper YMM registers are changed. */
1697 if ((tdep
->xcr0
& X86_XSTATE_ZMM
))
1699 for (i
= I387_YMM16H_REGNUM (tdep
);
1700 i
< I387_YMMH_AVX512_END_REGNUM (tdep
); i
++)
1702 regcache
->raw_collect (i
, raw
);
1703 p
= XSAVE_YMM_AVX512_ADDR (tdep
, regs
, i
);
1704 if (memcmp (raw
, p
, 16) != 0)
1706 xstate_bv
|= X86_XSTATE_ZMM
;
1707 memcpy (p
, raw
, 16);
1710 for (i
= I387_XMM16_REGNUM (tdep
);
1711 i
< I387_XMM_AVX512_END_REGNUM (tdep
); i
++)
1713 regcache
->raw_collect (i
, raw
);
1714 p
= XSAVE_XMM_AVX512_ADDR (tdep
, regs
, i
);
1715 if (memcmp (raw
, p
, 16) != 0)
1717 xstate_bv
|= X86_XSTATE_ZMM
;
1718 memcpy (p
, raw
, 16);
1723 /* Check if any upper MPX registers are changed. */
1724 if ((tdep
->xcr0
& X86_XSTATE_BNDREGS
))
1725 for (i
= I387_BND0R_REGNUM (tdep
);
1726 i
< I387_BNDCFGU_REGNUM (tdep
); i
++)
1728 regcache
->raw_collect (i
, raw
);
1729 p
= XSAVE_BNDREGS_ADDR (tdep
, regs
, i
);
1730 if (memcmp (raw
, p
, 16))
1732 xstate_bv
|= X86_XSTATE_BNDREGS
;
1733 memcpy (p
, raw
, 16);
1737 /* Check if any upper MPX registers are changed. */
1738 if ((tdep
->xcr0
& X86_XSTATE_BNDCFG
))
1739 for (i
= I387_BNDCFGU_REGNUM (tdep
);
1740 i
< I387_MPXEND_REGNUM (tdep
); i
++)
1742 regcache
->raw_collect (i
, raw
);
1743 p
= XSAVE_BNDCFG_ADDR (tdep
, regs
, i
);
1744 if (memcmp (raw
, p
, 8))
1746 xstate_bv
|= X86_XSTATE_BNDCFG
;
1751 /* Check if any upper YMM registers are changed. */
1752 if ((tdep
->xcr0
& X86_XSTATE_AVX
))
1753 for (i
= I387_YMM0H_REGNUM (tdep
);
1754 i
< I387_YMMENDH_REGNUM (tdep
); i
++)
1756 regcache
->raw_collect (i
, raw
);
1757 p
= XSAVE_AVXH_ADDR (tdep
, regs
, i
);
1758 if (memcmp (raw
, p
, 16))
1760 xstate_bv
|= X86_XSTATE_AVX
;
1761 memcpy (p
, raw
, 16);
1765 /* Check if any SSE registers are changed. */
1766 if ((tdep
->xcr0
& X86_XSTATE_SSE
))
1767 for (i
= I387_XMM0_REGNUM (tdep
);
1768 i
< I387_MXCSR_REGNUM (tdep
); i
++)
1770 regcache
->raw_collect (i
, raw
);
1771 p
= FXSAVE_ADDR (tdep
, regs
, i
);
1772 if (memcmp (raw
, p
, 16))
1774 xstate_bv
|= X86_XSTATE_SSE
;
1775 memcpy (p
, raw
, 16);
1779 if ((tdep
->xcr0
& X86_XSTATE_AVX
) || (tdep
->xcr0
& X86_XSTATE_SSE
))
1781 i
= I387_MXCSR_REGNUM (tdep
);
1782 regcache
->raw_collect (i
, raw
);
1783 p
= FXSAVE_MXCSR_ADDR (regs
);
1784 if (memcmp (raw
, p
, 4))
1786 /* Now, we need to mark one of either SSE of AVX as enabled.
1787 We could pick either. What we do is check to see if one
1788 of the features is already enabled, if it is then we leave
1789 it at that, otherwise we pick SSE. */
1790 if ((xstate_bv
& (X86_XSTATE_SSE
| X86_XSTATE_AVX
)) == 0)
1791 xstate_bv
|= X86_XSTATE_SSE
;
1796 /* Check if any X87 registers are changed. Only the non-control
1797 registers are handled here, the control registers are all handled
1798 later on in this function. */
1799 if ((tdep
->xcr0
& X86_XSTATE_X87
))
1800 for (i
= I387_ST0_REGNUM (tdep
);
1801 i
< I387_FCTRL_REGNUM (tdep
); i
++)
1803 regcache
->raw_collect (i
, raw
);
1804 p
= FXSAVE_ADDR (tdep
, regs
, i
);
1805 if (memcmp (raw
, p
, 10))
1807 xstate_bv
|= X86_XSTATE_X87
;
1808 memcpy (p
, raw
, 10);
1814 /* Check if REGNUM is changed. */
1815 regcache
->raw_collect (regnum
, raw
);
1820 internal_error (_("invalid i387 regclass"));
1823 /* This is a PKEYS register. */
1824 p
= XSAVE_PKEYS_ADDR (tdep
, regs
, regnum
);
1825 if (memcmp (raw
, p
, 4) != 0)
1827 xstate_bv
|= X86_XSTATE_PKRU
;
1832 case avx512_zmm16_h
:
1833 /* This is a ZMM16-31 register. */
1834 p
= XSAVE_AVX512_ZMM16_H_ADDR (tdep
, regs
, regnum
);
1835 if (memcmp (raw
, p
, 32) != 0)
1837 xstate_bv
|= X86_XSTATE_ZMM
;
1838 memcpy (p
, raw
, 32);
1843 /* This is a ZMM0-15 register. */
1844 p
= XSAVE_AVX512_ZMM0_H_ADDR (tdep
, regs
, regnum
);
1845 if (memcmp (raw
, p
, 32) != 0)
1847 xstate_bv
|= X86_XSTATE_ZMM_H
;
1848 memcpy (p
, raw
, 32);
1853 /* This is a AVX512 mask register. */
1854 p
= XSAVE_AVX512_K_ADDR (tdep
, regs
, regnum
);
1855 if (memcmp (raw
, p
, 8) != 0)
1857 xstate_bv
|= X86_XSTATE_K
;
1862 case avx512_ymmh_avx512
:
1863 /* This is an upper YMM16-31 register. */
1864 p
= XSAVE_YMM_AVX512_ADDR (tdep
, regs
, regnum
);
1865 if (memcmp (raw
, p
, 16) != 0)
1867 xstate_bv
|= X86_XSTATE_ZMM
;
1868 memcpy (p
, raw
, 16);
1872 case avx512_xmm_avx512
:
1873 /* This is an upper XMM16-31 register. */
1874 p
= XSAVE_XMM_AVX512_ADDR (tdep
, regs
, regnum
);
1875 if (memcmp (raw
, p
, 16) != 0)
1877 xstate_bv
|= X86_XSTATE_ZMM
;
1878 memcpy (p
, raw
, 16);
1883 /* This is an upper YMM register. */
1884 p
= XSAVE_AVXH_ADDR (tdep
, regs
, regnum
);
1885 if (memcmp (raw
, p
, 16))
1887 xstate_bv
|= X86_XSTATE_AVX
;
1888 memcpy (p
, raw
, 16);
1893 regcache
->raw_collect (regnum
, raw
);
1894 p
= XSAVE_BNDREGS_ADDR (tdep
, regs
, regnum
);
1895 if (memcmp (raw
, p
, 16))
1897 xstate_bv
|= X86_XSTATE_BNDREGS
;
1898 memcpy (p
, raw
, 16);
1903 p
= XSAVE_BNDCFG_ADDR (tdep
, regs
, regnum
);
1904 xstate_bv
|= X86_XSTATE_BNDCFG
;
1909 /* This is an SSE register. */
1910 p
= FXSAVE_ADDR (tdep
, regs
, regnum
);
1911 if (memcmp (raw
, p
, 16))
1913 xstate_bv
|= X86_XSTATE_SSE
;
1914 memcpy (p
, raw
, 16);
1919 /* This is an x87 register. */
1920 p
= FXSAVE_ADDR (tdep
, regs
, regnum
);
1921 if (memcmp (raw
, p
, 10))
1923 xstate_bv
|= X86_XSTATE_X87
;
1924 memcpy (p
, raw
, 10);
1928 case x87_ctrl_or_mxcsr
:
1929 /* We only handle MXCSR here. All other x87 control registers
1930 are handled separately below. */
1931 if (regnum
== I387_MXCSR_REGNUM (tdep
))
1933 p
= FXSAVE_MXCSR_ADDR (regs
);
1934 if (memcmp (raw
, p
, 2))
1936 /* We're only setting MXCSR, so check the initial state
1937 to see if either of AVX or SSE are already enabled.
1938 If they are then we'll attribute this changed MXCSR to
1939 that feature. If neither feature is enabled, then
1940 we'll attribute this change to the SSE feature. */
1941 xstate_bv
|= (initial_xstate_bv
1942 & (X86_XSTATE_AVX
| X86_XSTATE_SSE
));
1943 if ((xstate_bv
& (X86_XSTATE_AVX
| X86_XSTATE_SSE
)) == 0)
1944 xstate_bv
|= X86_XSTATE_SSE
;
1951 /* Only handle x87 control registers. */
1952 for (i
= I387_FCTRL_REGNUM (tdep
); i
< I387_XMM0_REGNUM (tdep
); i
++)
1953 if (regnum
== -1 || regnum
== i
)
1955 /* Most of the FPU control registers occupy only 16 bits in
1956 the xsave extended state. Give those a special treatment. */
1957 if (i
!= I387_FIOFF_REGNUM (tdep
)
1958 && i
!= I387_FOOFF_REGNUM (tdep
))
1962 regcache
->raw_collect (i
, buf
);
1964 if (i
== I387_FOP_REGNUM (tdep
))
1966 /* The opcode occupies only 11 bits. Make sure we
1967 don't touch the other bits. */
1968 buf
[1] &= ((1 << 3) - 1);
1969 buf
[1] |= ((FXSAVE_ADDR (tdep
, regs
, i
))[1] & ~((1 << 3) - 1));
1971 else if (i
== I387_FTAG_REGNUM (tdep
))
1973 /* Converting back is much easier. */
1975 unsigned short ftag
;
1978 ftag
= (buf
[1] << 8) | buf
[0];
1982 for (fpreg
= 7; fpreg
>= 0; fpreg
--)
1984 int tag
= (ftag
>> (fpreg
* 2)) & 3;
1987 buf
[0] |= (1 << fpreg
);
1990 p
= FXSAVE_ADDR (tdep
, regs
, i
);
1991 if (memcmp (p
, buf
, 2))
1993 xstate_bv
|= X86_XSTATE_X87
;
2001 regcache
->raw_collect (i
, raw
);
2002 regsize
= regcache_register_size (regcache
, i
);
2003 p
= FXSAVE_ADDR (tdep
, regs
, i
);
2004 if (memcmp (raw
, p
, regsize
))
2006 xstate_bv
|= X86_XSTATE_X87
;
2007 memcpy (p
, raw
, regsize
);
2012 /* Update the corresponding bits in `xstate_bv' if any
2013 registers are changed. */
2016 /* The supported bits in `xstat_bv' are 8 bytes. */
2017 initial_xstate_bv
|= xstate_bv
;
2018 store_unsigned_integer (XSAVE_XSTATE_BV_ADDR (regs
),
2024 /* Recreate the FTW (tag word) valid bits from the 80-bit FP data in
2028 i387_tag (const gdb_byte
*raw
)
2031 unsigned int exponent
;
2032 unsigned long fraction
[2];
2034 integer
= raw
[7] & 0x80;
2035 exponent
= (((raw
[9] & 0x7f) << 8) | raw
[8]);
2036 fraction
[0] = ((raw
[3] << 24) | (raw
[2] << 16) | (raw
[1] << 8) | raw
[0]);
2037 fraction
[1] = (((raw
[7] & 0x7f) << 24) | (raw
[6] << 16)
2038 | (raw
[5] << 8) | raw
[4]);
2040 if (exponent
== 0x7fff)
2045 else if (exponent
== 0x0000)
2047 if (fraction
[0] == 0x0000 && fraction
[1] == 0x0000 && !integer
)
2073 /* Prepare the FPU stack in REGCACHE for a function return. */
2076 i387_return_value (struct gdbarch
*gdbarch
, struct regcache
*regcache
)
2078 i386_gdbarch_tdep
*tdep
= gdbarch_tdep
<i386_gdbarch_tdep
> (gdbarch
);
2081 /* Set the top of the floating-point register stack to 7. The
2082 actual value doesn't really matter, but 7 is what a normal
2083 function return would end up with if the program started out with
2084 a freshly initialized FPU. */
2085 regcache_raw_read_unsigned (regcache
, I387_FSTAT_REGNUM (tdep
), &fstat
);
2087 regcache_raw_write_unsigned (regcache
, I387_FSTAT_REGNUM (tdep
), fstat
);
2089 /* Mark %st(1) through %st(7) as empty. Since we set the top of the
2090 floating-point register stack to 7, the appropriate value for the
2091 tag word is 0x3fff. */
2092 regcache_raw_write_unsigned (regcache
, I387_FTAG_REGNUM (tdep
), 0x3fff);
2096 /* See i387-tdep.h. */
2099 i387_reset_bnd_regs (struct gdbarch
*gdbarch
, struct regcache
*regcache
)
2101 i386_gdbarch_tdep
*tdep
= gdbarch_tdep
<i386_gdbarch_tdep
> (gdbarch
);
2103 if (I387_BND0R_REGNUM (tdep
) > 0)
2105 gdb_byte bnd_buf
[16];
2107 memset (bnd_buf
, 0, 16);
2108 for (int i
= 0; i
< I387_NUM_BND_REGS
; i
++)
2109 regcache
->raw_write (I387_BND0R_REGNUM (tdep
) + i
, bnd_buf
);