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"
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 const 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 (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;
366 /* Convert to TYPE. */
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
,
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 (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."));
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) ... */
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). */
428 24, /* `foseg' (16 bits). */
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
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
;
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
)
457 regcache
->raw_supply (i
, NULL
);
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
))
468 memcpy (val
, FSAVE_ADDR (tdep
, regs
, i
), 2);
470 if (i
== I387_FOP_REGNUM (tdep
))
471 val
[1] &= ((1 << 3) - 1);
472 regcache
->raw_supply (i
, val
);
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
))
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
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
;
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
))
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);
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 ... */
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). */
552 20, /* `foseg' (16 bits). */
554 6, /* `fop' (bottom 11 bits). */
555 160 + 0 * 16, /* %xmm0 through ... */
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. */
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
;
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
)
606 regcache
->raw_supply (i
, NULL
);
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
))
617 memcpy (val
, FXSAVE_ADDR (tdep
, regs
, i
), 2);
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;
631 top
= ((FXSAVE_ADDR (tdep
, regs
,
632 I387_FSTAT_REGNUM (tdep
)))[1] >> 3);
635 for (fpreg
= 7; fpreg
>= 0; fpreg
--)
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
));
648 ftag
|= tag
<< (2 * fpreg
);
650 val
[0] = ftag
& 0xff;
651 val
[1] = (ftag
>> 8) & 0xff;
653 regcache
->raw_supply (i
, val
);
656 regcache
->raw_supply (i
, FXSAVE_ADDR (tdep
, regs
, i
));
659 if (regnum
== I387_MXCSR_REGNUM (tdep
) || regnum
== -1)
662 regcache
->raw_supply (I387_MXCSR_REGNUM (tdep
), NULL
);
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
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
;
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
))
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. */
711 ftag
= (buf
[1] << 8) | buf
[0];
715 for (fpreg
= 7; fpreg
>= 0; fpreg
--)
717 int tag
= (ftag
>> (fpreg
* 2)) & 3;
720 buf
[0] |= (1 << fpreg
);
723 memcpy (FXSAVE_ADDR (tdep
, regs
, i
), buf
, 2);
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 ... */
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... */
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... */
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_avx512_k_offset[REGNUM] you'll find the relative offset
822 within the K region of the XSAVE extended state where the AVX512
823 opmask register K0 + REGNUM is stored. */
825 static int xsave_avx512_k_offset
[] =
827 0 * 8, /* %k0 through... */
834 7 * 8 /* %k7 (64 bits each). */
837 #define XSAVE_AVX512_K_ADDR(tdep, xsave, regnum) \
838 (xsave + (tdep)->xsave_layout.k_offset \
839 + xsave_avx512_k_offset[regnum - I387_K0_REGNUM (tdep)])
842 /* At xsave_avx512_zmm0_h_offset[REGNUM] you find the relative offset
843 within the ZMM_H region of the XSAVE extended state where the upper
844 256bits of the GDB register ZMM0 + REGNUM is stored. */
846 static int xsave_avx512_zmm0_h_offset
[] =
848 0 * 32, /* Upper 256bit of %zmmh0 through... */
863 15 * 32 /* Upper 256bit of... %zmmh15 (256 bits each). */
866 #define XSAVE_AVX512_ZMM0_H_ADDR(tdep, xsave, regnum) \
867 (xsave + (tdep)->xsave_layout.zmm_h_offset \
868 + xsave_avx512_zmm0_h_offset[regnum - I387_ZMM0H_REGNUM (tdep)])
870 /* At xsave_avx512_zmm16_h_offset[REGNUM] you find the relative offset
871 within the ZMM_H region of the XSAVE extended state where the upper
872 256bits of the GDB register ZMM16 + REGNUM is stored. */
874 static int xsave_avx512_zmm16_h_offset
[] =
876 32 + 0 * 64, /* Upper 256bit of... %zmmh16 (256 bits each). */
891 32 + 15 * 64 /* Upper 256bit of... %zmmh31 (256 bits each). */
894 #define XSAVE_AVX512_ZMM16_H_ADDR(tdep, xsave, regnum) \
895 (xsave + (tdep)->xsave_layout.zmm_offset \
896 + xsave_avx512_zmm16_h_offset[regnum - I387_ZMM16H_REGNUM (tdep)])
898 /* At xsave_pkeys_offset[REGNUM] you'll find the relative offset
899 within the PKEYS region of the XSAVE extended state where the PKRU
900 register is stored. */
902 static int xsave_pkeys_offset
[] =
904 0 * 8 /* %pkru (64 bits in XSTATE, 32-bit actually used by
905 instructions and applications). */
908 #define XSAVE_PKEYS_ADDR(tdep, xsave, regnum) \
909 (xsave + (tdep)->xsave_layout.pkru_offset \
910 + xsave_pkeys_offset[regnum - I387_PKRU_REGNUM (tdep)])
913 /* See i387-tdep.h. */
916 i387_guess_xsave_layout (uint64_t xcr0
, size_t xsave_size
,
917 x86_xsave_layout
&layout
)
919 if (HAS_PKRU (xcr0
) && xsave_size
== 2696)
921 /* Intel CPUs supporting PKRU. */
922 layout
.avx_offset
= 576;
923 layout
.k_offset
= 1088;
924 layout
.zmm_h_offset
= 1152;
925 layout
.zmm_offset
= 1664;
926 layout
.pkru_offset
= 2688;
928 else if (HAS_PKRU (xcr0
) && xsave_size
== 2440)
930 /* AMD CPUs supporting PKRU. */
931 layout
.avx_offset
= 576;
932 layout
.k_offset
= 832;
933 layout
.zmm_h_offset
= 896;
934 layout
.zmm_offset
= 1408;
935 layout
.pkru_offset
= 2432;
937 else if (HAS_AVX512 (xcr0
) && xsave_size
== 2688)
939 /* Intel CPUs supporting AVX512. */
940 layout
.avx_offset
= 576;
941 layout
.k_offset
= 1088;
942 layout
.zmm_h_offset
= 1152;
943 layout
.zmm_offset
= 1664;
945 /* As MPX has been removed, we need the additional check
946 (xsave_size == 1088) to allow reading AVX registers from corefiles
947 on CPUs with MPX as the highest supported feature. */
948 else if (HAS_AVX (xcr0
) && (xsave_size
== 832 || xsave_size
== 1088))
950 /* Intel and AMD CPUs supporting AVX. */
951 layout
.avx_offset
= 576;
956 layout
.sizeof_xsave
= xsave_size
;
960 /* See i387-tdep.h. */
963 i387_fallback_xsave_layout (uint64_t xcr0
)
965 x86_xsave_layout layout
;
969 /* Intel CPUs supporting PKRU. */
970 layout
.avx_offset
= 576;
971 layout
.k_offset
= 1088;
972 layout
.zmm_h_offset
= 1152;
973 layout
.zmm_offset
= 1664;
974 layout
.pkru_offset
= 2688;
975 layout
.sizeof_xsave
= 2696;
977 else if (HAS_AVX512 (xcr0
))
979 /* Intel CPUs supporting AVX512. */
980 layout
.avx_offset
= 576;
981 layout
.k_offset
= 1088;
982 layout
.zmm_h_offset
= 1152;
983 layout
.zmm_offset
= 1664;
984 layout
.sizeof_xsave
= 2688;
986 else if (HAS_AVX (xcr0
))
988 /* Intel and AMD CPUs supporting AVX. */
989 layout
.avx_offset
= 576;
990 layout
.sizeof_xsave
= 832;
996 /* Extract from XSAVE a bitset of the features that are available on the
997 target, but which have not yet been enabled. */
1000 i387_xsave_get_clear_bv (struct gdbarch
*gdbarch
, const void *xsave
)
1002 enum bfd_endian byte_order
= gdbarch_byte_order (gdbarch
);
1003 const gdb_byte
*regs
= (const gdb_byte
*) xsave
;
1004 i386_gdbarch_tdep
*tdep
= gdbarch_tdep
<i386_gdbarch_tdep
> (gdbarch
);
1006 /* Get `xstat_bv'. The supported bits in `xstat_bv' are 8 bytes. */
1007 ULONGEST xstate_bv
= extract_unsigned_integer (XSAVE_XSTATE_BV_ADDR (regs
),
1010 /* Clear part in vector registers if its bit in xstat_bv is zero. */
1011 ULONGEST clear_bv
= (~(xstate_bv
)) & tdep
->xcr0
;
1016 /* Similar to i387_supply_fxsave, but use XSAVE extended state. */
1019 i387_supply_xsave (struct regcache
*regcache
, int regnum
,
1022 struct gdbarch
*gdbarch
= regcache
->arch ();
1023 enum bfd_endian byte_order
= gdbarch_byte_order (gdbarch
);
1024 i386_gdbarch_tdep
*tdep
= gdbarch_tdep
<i386_gdbarch_tdep
> (gdbarch
);
1025 const gdb_byte
*regs
= (const gdb_byte
*) xsave
;
1027 /* In 64-bit mode the split between "low" and "high" ZMM registers is at
1028 ZMM16. Outside of 64-bit mode there are no "high" ZMM registers at all.
1029 Precalculate the number to be used for the split point, with the all
1030 registers in the "low" portion outside of 64-bit mode. */
1031 unsigned int zmm_endlo_regnum
= I387_ZMM0H_REGNUM (tdep
)
1032 + std::min (tdep
->num_zmm_regs
, 16);
1041 avx512_zmm0_h
= 0x10,
1042 avx512_zmm16_h
= 0x20,
1043 avx512_ymmh_avx512
= 0x40,
1044 avx512_xmm_avx512
= 0x80,
1046 all
= x87
| sse
| avxh
| avx512_k
| avx512_zmm0_h
| avx512_zmm16_h
1047 | avx512_ymmh_avx512
| avx512_xmm_avx512
| pkeys
1050 gdb_assert (regs
!= NULL
);
1051 gdb_assert (tdep
->st0_regnum
>= I386_ST0_REGNUM
);
1052 gdb_assert (tdep
->num_xmm_regs
> 0);
1056 else if (regnum
>= I387_PKRU_REGNUM (tdep
)
1057 && regnum
< I387_PKEYSEND_REGNUM (tdep
))
1059 else if (regnum
>= I387_ZMM0H_REGNUM (tdep
)
1060 && regnum
< I387_ZMM16H_REGNUM (tdep
))
1061 regclass
= avx512_zmm0_h
;
1062 else if (regnum
>= I387_ZMM16H_REGNUM (tdep
)
1063 && regnum
< I387_ZMMENDH_REGNUM (tdep
))
1064 regclass
= avx512_zmm16_h
;
1065 else if (regnum
>= I387_K0_REGNUM (tdep
)
1066 && regnum
< I387_KEND_REGNUM (tdep
))
1067 regclass
= avx512_k
;
1068 else if (regnum
>= I387_YMM16H_REGNUM (tdep
)
1069 && regnum
< I387_YMMH_AVX512_END_REGNUM (tdep
))
1070 regclass
= avx512_ymmh_avx512
;
1071 else if (regnum
>= I387_XMM16_REGNUM (tdep
)
1072 && regnum
< I387_XMM_AVX512_END_REGNUM (tdep
))
1073 regclass
= avx512_xmm_avx512
;
1074 else if (regnum
>= I387_YMM0H_REGNUM (tdep
)
1075 && regnum
< I387_YMMENDH_REGNUM (tdep
))
1077 else if (regnum
>= I387_XMM0_REGNUM (tdep
)
1078 && regnum
< I387_MXCSR_REGNUM (tdep
))
1080 else if (regnum
>= I387_ST0_REGNUM (tdep
)
1081 && regnum
< I387_FCTRL_REGNUM (tdep
))
1086 clear_bv
= i387_xsave_get_clear_bv (gdbarch
, xsave
);
1088 /* With the delayed xsave mechanism, in between the program
1089 starting, and the program accessing the vector registers for the
1090 first time, the register's values are invalid. The kernel
1091 initializes register states to zero when they are set the first
1092 time in a program. This means that from the user-space programs'
1093 perspective, it's the same as if the registers have always been
1094 zero from the start of the program. Therefore, the debugger
1095 should provide the same illusion to the user. */
1103 if ((clear_bv
& X86_XSTATE_PKRU
))
1104 regcache
->raw_supply_zeroed (regnum
);
1106 regcache
->raw_supply (regnum
, XSAVE_PKEYS_ADDR (tdep
, regs
, regnum
));
1110 if ((clear_bv
& X86_XSTATE_ZMM_H
))
1111 regcache
->raw_supply_zeroed (regnum
);
1113 regcache
->raw_supply (regnum
,
1114 XSAVE_AVX512_ZMM0_H_ADDR (tdep
, regs
, regnum
));
1117 case avx512_zmm16_h
:
1118 if ((clear_bv
& X86_XSTATE_ZMM
))
1119 regcache
->raw_supply_zeroed (regnum
);
1121 regcache
->raw_supply (regnum
,
1122 XSAVE_AVX512_ZMM16_H_ADDR (tdep
, regs
, regnum
));
1126 if ((clear_bv
& X86_XSTATE_K
))
1127 regcache
->raw_supply_zeroed (regnum
);
1129 regcache
->raw_supply (regnum
, XSAVE_AVX512_K_ADDR (tdep
, regs
, regnum
));
1132 case avx512_ymmh_avx512
:
1133 if ((clear_bv
& X86_XSTATE_ZMM
))
1134 regcache
->raw_supply_zeroed (regnum
);
1136 regcache
->raw_supply (regnum
,
1137 XSAVE_YMM_H_AVX512_ADDR (tdep
, regs
, regnum
));
1140 case avx512_xmm_avx512
:
1141 if ((clear_bv
& X86_XSTATE_ZMM
))
1142 regcache
->raw_supply_zeroed (regnum
);
1144 regcache
->raw_supply (regnum
,
1145 XSAVE_XMM_AVX512_ADDR (tdep
, regs
, regnum
));
1149 if ((clear_bv
& X86_XSTATE_AVX
))
1150 regcache
->raw_supply_zeroed (regnum
);
1152 regcache
->raw_supply (regnum
, XSAVE_AVXH_ADDR (tdep
, regs
, regnum
));
1156 if ((clear_bv
& X86_XSTATE_SSE
))
1157 regcache
->raw_supply_zeroed (regnum
);
1159 regcache
->raw_supply (regnum
, FXSAVE_ADDR (tdep
, regs
, regnum
));
1163 if ((clear_bv
& X86_XSTATE_X87
))
1164 regcache
->raw_supply_zeroed (regnum
);
1166 regcache
->raw_supply (regnum
, FXSAVE_ADDR (tdep
, regs
, regnum
));
1170 /* Handle PKEYS registers. */
1171 if ((tdep
->xcr0
& X86_XSTATE_PKRU
))
1173 if ((clear_bv
& X86_XSTATE_PKRU
))
1175 for (i
= I387_PKRU_REGNUM (tdep
);
1176 i
< I387_PKEYSEND_REGNUM (tdep
);
1178 regcache
->raw_supply_zeroed (i
);
1182 for (i
= I387_PKRU_REGNUM (tdep
);
1183 i
< I387_PKEYSEND_REGNUM (tdep
);
1185 regcache
->raw_supply (i
, XSAVE_PKEYS_ADDR (tdep
, regs
, i
));
1189 /* Handle the upper halves of the low 8/16 ZMM registers. */
1190 if ((tdep
->xcr0
& X86_XSTATE_ZMM_H
))
1192 if ((clear_bv
& X86_XSTATE_ZMM_H
))
1194 for (i
= I387_ZMM0H_REGNUM (tdep
); i
< zmm_endlo_regnum
; i
++)
1195 regcache
->raw_supply_zeroed (i
);
1199 for (i
= I387_ZMM0H_REGNUM (tdep
); i
< zmm_endlo_regnum
; i
++)
1200 regcache
->raw_supply (i
,
1201 XSAVE_AVX512_ZMM0_H_ADDR (tdep
, regs
, i
));
1205 /* Handle AVX512 OpMask registers. */
1206 if ((tdep
->xcr0
& X86_XSTATE_K
))
1208 if ((clear_bv
& X86_XSTATE_K
))
1210 for (i
= I387_K0_REGNUM (tdep
);
1211 i
< I387_KEND_REGNUM (tdep
);
1213 regcache
->raw_supply_zeroed (i
);
1217 for (i
= I387_K0_REGNUM (tdep
);
1218 i
< I387_KEND_REGNUM (tdep
);
1220 regcache
->raw_supply (i
, XSAVE_AVX512_K_ADDR (tdep
, regs
, i
));
1224 /* Handle the upper 16 ZMM/YMM/XMM registers (if any). */
1225 if ((tdep
->xcr0
& X86_XSTATE_ZMM
))
1227 if ((clear_bv
& X86_XSTATE_ZMM
))
1229 for (i
= I387_ZMM16H_REGNUM (tdep
);
1230 i
< I387_ZMMENDH_REGNUM (tdep
); i
++)
1231 regcache
->raw_supply_zeroed (i
);
1232 for (i
= I387_YMM16H_REGNUM (tdep
);
1233 i
< I387_YMMH_AVX512_END_REGNUM (tdep
);
1235 regcache
->raw_supply_zeroed (i
);
1236 for (i
= I387_XMM16_REGNUM (tdep
);
1237 i
< I387_XMM_AVX512_END_REGNUM (tdep
);
1239 regcache
->raw_supply_zeroed (i
);
1243 for (i
= I387_ZMM16H_REGNUM (tdep
);
1244 i
< I387_ZMMENDH_REGNUM (tdep
); i
++)
1245 regcache
->raw_supply (i
,
1246 XSAVE_AVX512_ZMM16_H_ADDR (tdep
, regs
, i
));
1247 for (i
= I387_YMM16H_REGNUM (tdep
);
1248 i
< I387_YMMH_AVX512_END_REGNUM (tdep
);
1250 regcache
->raw_supply (i
,
1251 XSAVE_YMM_H_AVX512_ADDR (tdep
, regs
, i
));
1252 for (i
= I387_XMM16_REGNUM (tdep
);
1253 i
< I387_XMM_AVX512_END_REGNUM (tdep
);
1255 regcache
->raw_supply (i
, XSAVE_XMM_AVX512_ADDR (tdep
, regs
, i
));
1258 /* Handle the upper YMM registers. */
1259 if ((tdep
->xcr0
& X86_XSTATE_AVX
))
1261 if ((clear_bv
& X86_XSTATE_AVX
))
1263 for (i
= I387_YMM0H_REGNUM (tdep
);
1264 i
< I387_YMMENDH_REGNUM (tdep
);
1266 regcache
->raw_supply_zeroed (i
);
1270 for (i
= I387_YMM0H_REGNUM (tdep
);
1271 i
< I387_YMMENDH_REGNUM (tdep
);
1273 regcache
->raw_supply (i
, XSAVE_AVXH_ADDR (tdep
, regs
, i
));
1277 /* Handle the XMM registers. */
1278 if ((tdep
->xcr0
& X86_XSTATE_SSE
))
1280 if ((clear_bv
& X86_XSTATE_SSE
))
1282 for (i
= I387_XMM0_REGNUM (tdep
);
1283 i
< I387_MXCSR_REGNUM (tdep
);
1285 regcache
->raw_supply_zeroed (i
);
1289 for (i
= I387_XMM0_REGNUM (tdep
);
1290 i
< I387_MXCSR_REGNUM (tdep
); i
++)
1291 regcache
->raw_supply (i
, FXSAVE_ADDR (tdep
, regs
, i
));
1295 /* Handle the x87 registers. */
1296 if ((tdep
->xcr0
& X86_XSTATE_X87
))
1298 if ((clear_bv
& X86_XSTATE_X87
))
1300 for (i
= I387_ST0_REGNUM (tdep
);
1301 i
< I387_FCTRL_REGNUM (tdep
);
1303 regcache
->raw_supply_zeroed (i
);
1307 for (i
= I387_ST0_REGNUM (tdep
);
1308 i
< I387_FCTRL_REGNUM (tdep
);
1310 regcache
->raw_supply (i
, FXSAVE_ADDR (tdep
, regs
, i
));
1316 /* Only handle x87 control registers. */
1317 for (i
= I387_FCTRL_REGNUM (tdep
); i
< I387_XMM0_REGNUM (tdep
); i
++)
1318 if (regnum
== -1 || regnum
== i
)
1320 if (clear_bv
& X86_XSTATE_X87
)
1322 if (i
== I387_FCTRL_REGNUM (tdep
))
1326 store_unsigned_integer (buf
, 4, byte_order
,
1327 I387_FCTRL_INIT_VAL
);
1328 regcache
->raw_supply (i
, buf
);
1330 else if (i
== I387_FTAG_REGNUM (tdep
))
1334 store_unsigned_integer (buf
, 4, byte_order
, 0xffff);
1335 regcache
->raw_supply (i
, buf
);
1338 regcache
->raw_supply_zeroed (i
);
1340 /* Most of the FPU control registers occupy only 16 bits in
1341 the xsave extended state. Give those a special treatment. */
1342 else if (i
!= I387_FIOFF_REGNUM (tdep
)
1343 && i
!= I387_FOOFF_REGNUM (tdep
))
1347 memcpy (val
, FXSAVE_ADDR (tdep
, regs
, i
), 2);
1348 val
[2] = val
[3] = 0;
1349 if (i
== I387_FOP_REGNUM (tdep
))
1350 val
[1] &= ((1 << 3) - 1);
1351 else if (i
== I387_FTAG_REGNUM (tdep
))
1353 /* The fxsave area contains a simplified version of
1354 the tag word. We have to look at the actual 80-bit
1355 FP data to recreate the traditional i387 tag word. */
1357 unsigned long ftag
= 0;
1361 top
= ((FXSAVE_ADDR (tdep
, regs
,
1362 I387_FSTAT_REGNUM (tdep
)))[1] >> 3);
1365 for (fpreg
= 7; fpreg
>= 0; fpreg
--)
1369 if (val
[0] & (1 << fpreg
))
1371 int thisreg
= (fpreg
+ 8 - top
) % 8
1372 + I387_ST0_REGNUM (tdep
);
1373 tag
= i387_tag (FXSAVE_ADDR (tdep
, regs
, thisreg
));
1376 tag
= 3; /* Empty */
1378 ftag
|= tag
<< (2 * fpreg
);
1380 val
[0] = ftag
& 0xff;
1381 val
[1] = (ftag
>> 8) & 0xff;
1383 regcache
->raw_supply (i
, val
);
1386 regcache
->raw_supply (i
, FXSAVE_ADDR (tdep
, regs
, i
));
1389 if (regnum
== I387_MXCSR_REGNUM (tdep
) || regnum
== -1)
1391 /* The MXCSR register is placed into the xsave buffer if either the
1392 AVX or SSE features are enabled. */
1393 if ((clear_bv
& (X86_XSTATE_AVX
| X86_XSTATE_SSE
))
1394 == (X86_XSTATE_AVX
| X86_XSTATE_SSE
))
1398 store_unsigned_integer (buf
, 4, byte_order
, I387_MXCSR_INIT_VAL
);
1399 regcache
->raw_supply (I387_MXCSR_REGNUM (tdep
), buf
);
1402 regcache
->raw_supply (I387_MXCSR_REGNUM (tdep
),
1403 FXSAVE_MXCSR_ADDR (regs
));
1407 /* Similar to i387_collect_fxsave, but use XSAVE extended state. */
1410 i387_collect_xsave (const struct regcache
*regcache
, int regnum
,
1411 void *xsave
, int gcore
)
1413 struct gdbarch
*gdbarch
= regcache
->arch ();
1414 enum bfd_endian byte_order
= gdbarch_byte_order (gdbarch
);
1415 i386_gdbarch_tdep
*tdep
= gdbarch_tdep
<i386_gdbarch_tdep
> (gdbarch
);
1416 gdb_byte
*p
, *regs
= (gdb_byte
*) xsave
;
1417 gdb_byte raw
[I386_MAX_REGISTER_SIZE
];
1418 ULONGEST initial_xstate_bv
, clear_bv
, xstate_bv
= 0;
1420 /* See the comment in i387_supply_xsave(). */
1421 unsigned int zmm_endlo_regnum
= I387_ZMM0H_REGNUM (tdep
)
1422 + std::min (tdep
->num_zmm_regs
, 16);
1425 x87_ctrl_or_mxcsr
= 0x1,
1430 avx512_zmm0_h
= 0x20,
1431 avx512_zmm16_h
= 0x40,
1432 avx512_ymmh_avx512
= 0x80,
1433 avx512_xmm_avx512
= 0x100,
1435 all
= x87
| sse
| avxh
| avx512_k
| avx512_zmm0_h
| avx512_zmm16_h
1436 | avx512_ymmh_avx512
| avx512_xmm_avx512
| pkeys
1439 gdb_assert (tdep
->st0_regnum
>= I386_ST0_REGNUM
);
1440 gdb_assert (tdep
->num_xmm_regs
> 0);
1444 else if (regnum
>= I387_PKRU_REGNUM (tdep
)
1445 && regnum
< I387_PKEYSEND_REGNUM (tdep
))
1447 else if (regnum
>= I387_ZMM0H_REGNUM (tdep
)
1448 && regnum
< I387_ZMM16H_REGNUM (tdep
))
1449 regclass
= avx512_zmm0_h
;
1450 else if (regnum
>= I387_ZMM16H_REGNUM (tdep
)
1451 && regnum
< I387_ZMMENDH_REGNUM (tdep
))
1452 regclass
= avx512_zmm16_h
;
1453 else if (regnum
>= I387_K0_REGNUM (tdep
)
1454 && regnum
< I387_KEND_REGNUM (tdep
))
1455 regclass
= avx512_k
;
1456 else if (regnum
>= I387_YMM16H_REGNUM (tdep
)
1457 && regnum
< I387_YMMH_AVX512_END_REGNUM (tdep
))
1458 regclass
= avx512_ymmh_avx512
;
1459 else if (regnum
>= I387_XMM16_REGNUM (tdep
)
1460 && regnum
< I387_XMM_AVX512_END_REGNUM (tdep
))
1461 regclass
= avx512_xmm_avx512
;
1462 else if (regnum
>= I387_YMM0H_REGNUM (tdep
)
1463 && regnum
< I387_YMMENDH_REGNUM (tdep
))
1465 else if (regnum
>= I387_XMM0_REGNUM (tdep
)
1466 && regnum
< I387_MXCSR_REGNUM (tdep
))
1468 else if (regnum
>= I387_ST0_REGNUM (tdep
)
1469 && regnum
< I387_FCTRL_REGNUM (tdep
))
1471 else if ((regnum
>= I387_FCTRL_REGNUM (tdep
)
1472 && regnum
< I387_XMM0_REGNUM (tdep
))
1473 || regnum
== I387_MXCSR_REGNUM (tdep
))
1474 regclass
= x87_ctrl_or_mxcsr
;
1476 internal_error (_("invalid i387 regnum %d"), regnum
);
1480 /* Clear XSAVE extended state. */
1481 memset (regs
, 0, tdep
->xsave_layout
.sizeof_xsave
);
1483 /* Update XCR0 and `xstate_bv' with XCR0 for gcore. */
1484 if (tdep
->xsave_xcr0_offset
!= -1)
1485 memcpy (regs
+ tdep
->xsave_xcr0_offset
, &tdep
->xcr0
, 8);
1486 memcpy (XSAVE_XSTATE_BV_ADDR (regs
), &tdep
->xcr0
, 8);
1489 /* The supported bits in `xstat_bv' are 8 bytes. */
1490 initial_xstate_bv
= extract_unsigned_integer (XSAVE_XSTATE_BV_ADDR (regs
),
1492 clear_bv
= (~(initial_xstate_bv
)) & tdep
->xcr0
;
1494 /* The XSAVE buffer was filled lazily by the kernel. Only those
1495 features that are enabled were written into the buffer, disabled
1496 features left the buffer uninitialised. In order to identify if any
1497 registers have changed we will be comparing the register cache
1498 version to the version in the XSAVE buffer, it is important then that
1499 at this point we initialise to the default values any features in
1500 XSAVE that are not yet initialised.
1502 This could be made more efficient, we know which features (from
1503 REGNUM) we will be potentially updating, and could limit ourselves to
1504 only clearing that feature. However, the extra complexity does not
1505 seem justified at this point. */
1508 if ((clear_bv
& X86_XSTATE_PKRU
))
1509 for (i
= I387_PKRU_REGNUM (tdep
);
1510 i
< I387_PKEYSEND_REGNUM (tdep
); i
++)
1511 memset (XSAVE_PKEYS_ADDR (tdep
, regs
, i
), 0, 4);
1513 if ((clear_bv
& X86_XSTATE_ZMM_H
))
1514 for (i
= I387_ZMM0H_REGNUM (tdep
); i
< zmm_endlo_regnum
; i
++)
1515 memset (XSAVE_AVX512_ZMM0_H_ADDR (tdep
, regs
, i
), 0, 32);
1517 if ((clear_bv
& X86_XSTATE_K
))
1518 for (i
= I387_K0_REGNUM (tdep
);
1519 i
< I387_KEND_REGNUM (tdep
); i
++)
1520 memset (XSAVE_AVX512_K_ADDR (tdep
, regs
, i
), 0, 8);
1522 if ((clear_bv
& X86_XSTATE_ZMM
))
1524 for (i
= I387_ZMM16H_REGNUM (tdep
); i
< I387_ZMMENDH_REGNUM (tdep
);
1526 memset (XSAVE_AVX512_ZMM16_H_ADDR (tdep
, regs
, i
), 0, 32);
1527 for (i
= I387_YMM16H_REGNUM (tdep
);
1528 i
< I387_YMMH_AVX512_END_REGNUM (tdep
); i
++)
1529 memset (XSAVE_YMM_H_AVX512_ADDR (tdep
, regs
, i
), 0, 16);
1530 for (i
= I387_XMM16_REGNUM (tdep
);
1531 i
< I387_XMM_AVX512_END_REGNUM (tdep
); i
++)
1532 memset (XSAVE_XMM_AVX512_ADDR (tdep
, regs
, i
), 0, 16);
1535 if ((clear_bv
& X86_XSTATE_AVX
))
1536 for (i
= I387_YMM0H_REGNUM (tdep
);
1537 i
< I387_YMMENDH_REGNUM (tdep
); i
++)
1538 memset (XSAVE_AVXH_ADDR (tdep
, regs
, i
), 0, 16);
1540 if ((clear_bv
& X86_XSTATE_SSE
))
1541 for (i
= I387_XMM0_REGNUM (tdep
);
1542 i
< I387_MXCSR_REGNUM (tdep
); i
++)
1543 memset (FXSAVE_ADDR (tdep
, regs
, i
), 0, 16);
1545 /* The mxcsr register is written into the xsave buffer if either AVX
1546 or SSE is enabled, so only clear it if both of those features
1547 require clearing. */
1548 if ((clear_bv
& (X86_XSTATE_AVX
| X86_XSTATE_SSE
))
1549 == (X86_XSTATE_AVX
| X86_XSTATE_SSE
))
1550 store_unsigned_integer (FXSAVE_MXCSR_ADDR (regs
), 2, byte_order
,
1551 I387_MXCSR_INIT_VAL
);
1553 if ((clear_bv
& X86_XSTATE_X87
))
1555 for (i
= I387_ST0_REGNUM (tdep
);
1556 i
< I387_FCTRL_REGNUM (tdep
); i
++)
1557 memset (FXSAVE_ADDR (tdep
, regs
, i
), 0, 10);
1559 for (i
= I387_FCTRL_REGNUM (tdep
);
1560 i
< I387_XMM0_REGNUM (tdep
); i
++)
1562 if (i
== I387_FCTRL_REGNUM (tdep
))
1563 store_unsigned_integer (FXSAVE_ADDR (tdep
, regs
, i
), 2,
1564 byte_order
, I387_FCTRL_INIT_VAL
);
1566 memset (FXSAVE_ADDR (tdep
, regs
, i
), 0,
1567 regcache_register_size (regcache
, i
));
1572 if (regclass
== all
)
1574 /* Check if any PKEYS registers are changed. */
1575 if ((tdep
->xcr0
& X86_XSTATE_PKRU
))
1576 for (i
= I387_PKRU_REGNUM (tdep
);
1577 i
< I387_PKEYSEND_REGNUM (tdep
); i
++)
1579 regcache
->raw_collect (i
, raw
);
1580 p
= XSAVE_PKEYS_ADDR (tdep
, regs
, i
);
1581 if (memcmp (raw
, p
, 4) != 0)
1583 xstate_bv
|= X86_XSTATE_PKRU
;
1588 /* Check if any ZMMH registers are changed. */
1589 if ((tdep
->xcr0
& X86_XSTATE_ZMM
))
1590 for (i
= I387_ZMM16H_REGNUM (tdep
);
1591 i
< I387_ZMMENDH_REGNUM (tdep
); i
++)
1593 regcache
->raw_collect (i
, raw
);
1594 p
= XSAVE_AVX512_ZMM16_H_ADDR (tdep
, regs
, i
);
1595 if (memcmp (raw
, p
, 32) != 0)
1597 xstate_bv
|= X86_XSTATE_ZMM
;
1598 memcpy (p
, raw
, 32);
1602 if ((tdep
->xcr0
& X86_XSTATE_ZMM_H
))
1603 for (i
= I387_ZMM0H_REGNUM (tdep
); i
< zmm_endlo_regnum
; i
++)
1605 regcache
->raw_collect (i
, raw
);
1606 p
= XSAVE_AVX512_ZMM0_H_ADDR (tdep
, regs
, i
);
1607 if (memcmp (raw
, p
, 32) != 0)
1609 xstate_bv
|= X86_XSTATE_ZMM_H
;
1610 memcpy (p
, raw
, 32);
1614 /* Check if any K registers are changed. */
1615 if ((tdep
->xcr0
& X86_XSTATE_K
))
1616 for (i
= I387_K0_REGNUM (tdep
);
1617 i
< I387_KEND_REGNUM (tdep
); i
++)
1619 regcache
->raw_collect (i
, raw
);
1620 p
= XSAVE_AVX512_K_ADDR (tdep
, regs
, i
);
1621 if (memcmp (raw
, p
, 8) != 0)
1623 xstate_bv
|= X86_XSTATE_K
;
1628 /* Check if any XMM or upper YMM registers are changed. */
1629 if ((tdep
->xcr0
& X86_XSTATE_ZMM
))
1631 for (i
= I387_YMM16H_REGNUM (tdep
);
1632 i
< I387_YMMH_AVX512_END_REGNUM (tdep
); i
++)
1634 regcache
->raw_collect (i
, raw
);
1635 p
= XSAVE_YMM_H_AVX512_ADDR (tdep
, regs
, i
);
1636 if (memcmp (raw
, p
, 16) != 0)
1638 xstate_bv
|= X86_XSTATE_ZMM
;
1639 memcpy (p
, raw
, 16);
1642 for (i
= I387_XMM16_REGNUM (tdep
);
1643 i
< I387_XMM_AVX512_END_REGNUM (tdep
); i
++)
1645 regcache
->raw_collect (i
, raw
);
1646 p
= XSAVE_XMM_AVX512_ADDR (tdep
, regs
, i
);
1647 if (memcmp (raw
, p
, 16) != 0)
1649 xstate_bv
|= X86_XSTATE_ZMM
;
1650 memcpy (p
, raw
, 16);
1655 /* Check if any upper YMM registers are changed. */
1656 if ((tdep
->xcr0
& X86_XSTATE_AVX
))
1657 for (i
= I387_YMM0H_REGNUM (tdep
);
1658 i
< I387_YMMENDH_REGNUM (tdep
); i
++)
1660 regcache
->raw_collect (i
, raw
);
1661 p
= XSAVE_AVXH_ADDR (tdep
, regs
, i
);
1662 if (memcmp (raw
, p
, 16))
1664 xstate_bv
|= X86_XSTATE_AVX
;
1665 memcpy (p
, raw
, 16);
1669 /* Check if any SSE registers are changed. */
1670 if ((tdep
->xcr0
& X86_XSTATE_SSE
))
1671 for (i
= I387_XMM0_REGNUM (tdep
);
1672 i
< I387_MXCSR_REGNUM (tdep
); i
++)
1674 regcache
->raw_collect (i
, raw
);
1675 p
= FXSAVE_ADDR (tdep
, regs
, i
);
1676 if (memcmp (raw
, p
, 16))
1678 xstate_bv
|= X86_XSTATE_SSE
;
1679 memcpy (p
, raw
, 16);
1683 if ((tdep
->xcr0
& X86_XSTATE_AVX
) || (tdep
->xcr0
& X86_XSTATE_SSE
))
1685 i
= I387_MXCSR_REGNUM (tdep
);
1686 regcache
->raw_collect (i
, raw
);
1687 p
= FXSAVE_MXCSR_ADDR (regs
);
1688 if (memcmp (raw
, p
, 4))
1690 /* Now, we need to mark one of either SSE of AVX as enabled.
1691 We could pick either. What we do is check to see if one
1692 of the features is already enabled, if it is then we leave
1693 it at that, otherwise we pick SSE. */
1694 if ((xstate_bv
& (X86_XSTATE_SSE
| X86_XSTATE_AVX
)) == 0)
1695 xstate_bv
|= X86_XSTATE_SSE
;
1700 /* Check if any X87 registers are changed. Only the non-control
1701 registers are handled here, the control registers are all handled
1702 later on in this function. */
1703 if ((tdep
->xcr0
& X86_XSTATE_X87
))
1704 for (i
= I387_ST0_REGNUM (tdep
);
1705 i
< I387_FCTRL_REGNUM (tdep
); i
++)
1707 regcache
->raw_collect (i
, raw
);
1708 p
= FXSAVE_ADDR (tdep
, regs
, i
);
1709 if (memcmp (raw
, p
, 10))
1711 xstate_bv
|= X86_XSTATE_X87
;
1712 memcpy (p
, raw
, 10);
1718 /* Check if REGNUM is changed. */
1719 regcache
->raw_collect (regnum
, raw
);
1724 internal_error (_("invalid i387 regclass"));
1727 /* This is a PKEYS register. */
1728 p
= XSAVE_PKEYS_ADDR (tdep
, regs
, regnum
);
1729 if (memcmp (raw
, p
, 4) != 0)
1731 xstate_bv
|= X86_XSTATE_PKRU
;
1736 case avx512_zmm16_h
:
1737 /* This is a ZMM16-31 register. */
1738 p
= XSAVE_AVX512_ZMM16_H_ADDR (tdep
, regs
, regnum
);
1739 if (memcmp (raw
, p
, 32) != 0)
1741 xstate_bv
|= X86_XSTATE_ZMM
;
1742 memcpy (p
, raw
, 32);
1747 /* This is a ZMM0-15 register. */
1748 p
= XSAVE_AVX512_ZMM0_H_ADDR (tdep
, regs
, regnum
);
1749 if (memcmp (raw
, p
, 32) != 0)
1751 xstate_bv
|= X86_XSTATE_ZMM_H
;
1752 memcpy (p
, raw
, 32);
1757 /* This is a AVX512 mask register. */
1758 p
= XSAVE_AVX512_K_ADDR (tdep
, regs
, regnum
);
1759 if (memcmp (raw
, p
, 8) != 0)
1761 xstate_bv
|= X86_XSTATE_K
;
1766 case avx512_ymmh_avx512
:
1767 /* This is an upper YMM16-31 register. */
1768 p
= XSAVE_YMM_H_AVX512_ADDR (tdep
, regs
, regnum
);
1769 if (memcmp (raw
, p
, 16) != 0)
1771 xstate_bv
|= X86_XSTATE_ZMM
;
1772 memcpy (p
, raw
, 16);
1776 case avx512_xmm_avx512
:
1777 /* This is an upper XMM16-31 register. */
1778 p
= XSAVE_XMM_AVX512_ADDR (tdep
, regs
, regnum
);
1779 if (memcmp (raw
, p
, 16) != 0)
1781 xstate_bv
|= X86_XSTATE_ZMM
;
1782 memcpy (p
, raw
, 16);
1787 /* This is an upper YMM register. */
1788 p
= XSAVE_AVXH_ADDR (tdep
, regs
, regnum
);
1789 if (memcmp (raw
, p
, 16))
1791 xstate_bv
|= X86_XSTATE_AVX
;
1792 memcpy (p
, raw
, 16);
1797 /* This is an SSE register. */
1798 p
= FXSAVE_ADDR (tdep
, regs
, regnum
);
1799 if (memcmp (raw
, p
, 16))
1801 xstate_bv
|= X86_XSTATE_SSE
;
1802 memcpy (p
, raw
, 16);
1807 /* This is an x87 register. */
1808 p
= FXSAVE_ADDR (tdep
, regs
, regnum
);
1809 if (memcmp (raw
, p
, 10))
1811 xstate_bv
|= X86_XSTATE_X87
;
1812 memcpy (p
, raw
, 10);
1816 case x87_ctrl_or_mxcsr
:
1817 /* We only handle MXCSR here. All other x87 control registers
1818 are handled separately below. */
1819 if (regnum
== I387_MXCSR_REGNUM (tdep
))
1821 p
= FXSAVE_MXCSR_ADDR (regs
);
1822 if (memcmp (raw
, p
, 2))
1824 /* We're only setting MXCSR, so check the initial state
1825 to see if either of AVX or SSE are already enabled.
1826 If they are then we'll attribute this changed MXCSR to
1827 that feature. If neither feature is enabled, then
1828 we'll attribute this change to the SSE feature. */
1829 xstate_bv
|= (initial_xstate_bv
1830 & (X86_XSTATE_AVX
| X86_XSTATE_SSE
));
1831 if ((xstate_bv
& (X86_XSTATE_AVX
| X86_XSTATE_SSE
)) == 0)
1832 xstate_bv
|= X86_XSTATE_SSE
;
1839 /* Only handle x87 control registers. */
1840 for (i
= I387_FCTRL_REGNUM (tdep
); i
< I387_XMM0_REGNUM (tdep
); i
++)
1841 if (regnum
== -1 || regnum
== i
)
1843 /* Most of the FPU control registers occupy only 16 bits in
1844 the xsave extended state. Give those a special treatment. */
1845 if (i
!= I387_FIOFF_REGNUM (tdep
)
1846 && i
!= I387_FOOFF_REGNUM (tdep
))
1850 regcache
->raw_collect (i
, buf
);
1852 if (i
== I387_FOP_REGNUM (tdep
))
1854 /* The opcode occupies only 11 bits. Make sure we
1855 don't touch the other bits. */
1856 buf
[1] &= ((1 << 3) - 1);
1857 buf
[1] |= ((FXSAVE_ADDR (tdep
, regs
, i
))[1] & ~((1 << 3) - 1));
1859 else if (i
== I387_FTAG_REGNUM (tdep
))
1861 /* Converting back is much easier. */
1863 unsigned short ftag
;
1866 ftag
= (buf
[1] << 8) | buf
[0];
1870 for (fpreg
= 7; fpreg
>= 0; fpreg
--)
1872 int tag
= (ftag
>> (fpreg
* 2)) & 3;
1875 buf
[0] |= (1 << fpreg
);
1878 p
= FXSAVE_ADDR (tdep
, regs
, i
);
1879 if (memcmp (p
, buf
, 2))
1881 xstate_bv
|= X86_XSTATE_X87
;
1889 regcache
->raw_collect (i
, raw
);
1890 regsize
= regcache_register_size (regcache
, i
);
1891 p
= FXSAVE_ADDR (tdep
, regs
, i
);
1892 if (memcmp (raw
, p
, regsize
))
1894 xstate_bv
|= X86_XSTATE_X87
;
1895 memcpy (p
, raw
, regsize
);
1900 /* Update the corresponding bits in `xstate_bv' if any
1901 registers are changed. */
1904 /* The supported bits in `xstat_bv' are 8 bytes. */
1905 initial_xstate_bv
|= xstate_bv
;
1906 store_unsigned_integer (XSAVE_XSTATE_BV_ADDR (regs
),
1912 /* Recreate the FTW (tag word) valid bits from the 80-bit FP data in
1916 i387_tag (const gdb_byte
*raw
)
1919 unsigned int exponent
;
1920 unsigned long fraction
[2];
1922 integer
= raw
[7] & 0x80;
1923 exponent
= (((raw
[9] & 0x7f) << 8) | raw
[8]);
1924 fraction
[0] = ((raw
[3] << 24) | (raw
[2] << 16) | (raw
[1] << 8) | raw
[0]);
1925 fraction
[1] = (((raw
[7] & 0x7f) << 24) | (raw
[6] << 16)
1926 | (raw
[5] << 8) | raw
[4]);
1928 if (exponent
== 0x7fff)
1933 else if (exponent
== 0x0000)
1935 if (fraction
[0] == 0x0000 && fraction
[1] == 0x0000 && !integer
)
1961 /* Prepare the FPU stack in REGCACHE for a function return. */
1964 i387_return_value (struct gdbarch
*gdbarch
, struct regcache
*regcache
)
1966 i386_gdbarch_tdep
*tdep
= gdbarch_tdep
<i386_gdbarch_tdep
> (gdbarch
);
1969 /* Set the top of the floating-point register stack to 7. The
1970 actual value doesn't really matter, but 7 is what a normal
1971 function return would end up with if the program started out with
1972 a freshly initialized FPU. */
1973 regcache_raw_read_unsigned (regcache
, I387_FSTAT_REGNUM (tdep
), &fstat
);
1975 regcache_raw_write_unsigned (regcache
, I387_FSTAT_REGNUM (tdep
), fstat
);
1977 /* Mark %st(1) through %st(7) as empty. Since we set the top of the
1978 floating-point register stack to 7, the appropriate value for the
1979 tag word is 0x3fff. */
1980 regcache_raw_write_unsigned (regcache
, I387_FTAG_REGNUM (tdep
), 0x3fff);