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