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