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