56 unsigned int exponent;
57 unsigned long fraction[2];
60 integer = raw[7] & 0x80;
61 exponent = (((raw[9] & 0x7f) << 8) | raw[8]);
62 fraction[0] = ((raw[3] << 24) | (raw[2] << 16) | (raw[1] << 8) | raw[0]);
63 fraction[1] = (((raw[7] & 0x7f) << 24) | (raw[6] << 16)
64 | (raw[5] << 8) | raw[4]);
66 if (exponent == 0x7fff && integer)
68 if (fraction[0] == 0x00000000 && fraction[1] == 0x00000000)
71 else if (sign && fraction[0] == 0x00000000 && fraction[1] == 0x40000000)
74 else if (fraction[1] & 0x40000000)
81 else if (exponent < 0x7fff && exponent > 0x0000 && integer)
84 else if (exponent == 0x0000)
92 else if (fraction[0] || fraction[1])
136 " TOP: %d\n", ((
status >> 11) & 7));
144 unsigned int control,
struct ui_file *file)
165 switch ((control >> 8) & 3)
182 switch ((control >> 10) & 3)
248 top = ((fstat >> 11) & 7);
250 for (fpreg = 7; fpreg >= 0; fpreg--)
252 struct value *regval;
261 tag = (ftag >> (fpreg * 2)) & 3;
290 for (i = 9; i >= 0; i--)
293 if (tag != -1 && tag != 3)
319 :
_(
"<unavailable>"));
350 int *optimizedp,
int *unavailablep)
360 warning (
_(
"Cannot convert floating-point register value " 361 "to non-floating-point type."));
362 *optimizedp = *unavailablep = 0;
369 from, optimizedp, unavailablep))
373 *optimizedp = *unavailablep = 0;
392 warning (
_(
"Cannot convert non-floating-point type " 393 "to floating-point register value."));
429 #define FSAVE_ADDR(tdep, fsave, regnum) \ 430 (fsave + fsave_offset[regnum - I387_ST0_REGNUM (tdep)]) 467 val[1] &= ((1 << 3) - 1);
517 buf[1] &= ((1 << 3) - 1);
568 #define FXSAVE_ADDR(tdep, fxsave, regnum) \ 569 (fxsave + fxsave_offset[regnum - I387_ST0_REGNUM (tdep)]) 576 #define FXSAVE_MXCSR_ADDR(fxsave) (fxsave + 24) 614 val[1] &= ((1 << 3) - 1);
621 unsigned long ftag = 0;
629 for (fpreg = 7; fpreg >= 0; fpreg--)
633 if (val[0] & (1 << fpreg))
635 int thisreg = (fpreg + 8 - top) % 8
642 ftag |= tag << (2 * fpreg);
644 val[0] = ftag & 0xff;
645 val[1] = (ftag >> 8) & 0xff;
694 buf[1] &= ((1 << 3) - 1);
704 ftag = (buf[1] << 8) | buf[0];
708 for (fpreg = 7; fpreg >= 0; fpreg--)
710 int tag = (ftag >> (fpreg * 2)) & 3;
713 buf[0] |= (1 << fpreg);
728 #define XSAVE_XSTATE_BV_ADDR(xsave) (xsave + 512) 754 #define XSAVE_AVXH_ADDR(tdep, xsave, regnum) \ 755 (xsave + xsave_avxh_offset[regnum - I387_YMM0H_REGNUM (tdep)]) 782 #define XSAVE_YMM_AVX512_ADDR(tdep, xsave, regnum) \ 783 (xsave + xsave_ymm_avx512_offset[regnum - I387_YMM16H_REGNUM (tdep)]) 805 #define XSAVE_XMM_AVX512_ADDR(tdep, xsave, regnum) \ 806 (xsave + xsave_xmm_avx512_offset[regnum - I387_XMM16_REGNUM (tdep)]) 817 #define XSAVE_MPX_ADDR(tdep, xsave, regnum) \ 818 (xsave + xsave_mpx_offset[regnum - I387_BND0R_REGNUM (tdep)]) 836 #define XSAVE_AVX512_K_ADDR(tdep, xsave, regnum) \ 837 (xsave + xsave_avx512_k_offset[regnum - I387_K0_REGNUM (tdep)]) 879 #define XSAVE_AVX512_ZMM_H_ADDR(tdep, xsave, regnum) \ 880 (xsave + xsave_avx512_zmm_h_offset[regnum - I387_ZMM0H_REGNUM (tdep)]) 892 #define XSAVE_PKEYS_ADDR(tdep, xsave, regnum) \ 893 (xsave + xsave_pkeys_offset[regnum - I387_PKRU_REGNUM (tdep)]) 916 avx512_ymmh_avx512 = 0x40,
917 avx512_xmm_avx512 = 0x80,
919 all = x87 | sse | avxh | mpx | avx512_k | avx512_zmm_h
920 | avx512_ymmh_avx512 | avx512_xmm_avx512 | pkeys
934 regclass = avx512_zmm_h;
940 regclass = avx512_ymmh_avx512;
943 regclass = avx512_xmm_avx512;
959 if (regclass != none)
969 clear_bv = (~(xstate_bv)) & tdep->
xcr0;
1012 case avx512_ymmh_avx512:
1020 case avx512_xmm_avx512:
1257 val[2] = val[3] = 0;
1259 val[1] &= ((1 << 3) - 1);
1266 unsigned long ftag = 0;
1274 for (fpreg = 7; fpreg >= 0; fpreg--)
1278 if (val[0] & (1 << fpreg))
1280 int thisreg = (fpreg + 8 - top) % 8
1287 ftag |= tag << (2 * fpreg);
1289 val[0] = ftag & 0xff;
1290 val[1] = (ftag >> 8) & 0xff;
1307 void *xsave,
int gcore)
1321 avx512_k = 0x20 |
check,
1322 avx512_zmm_h = 0x40 |
check,
1323 avx512_ymmh_avx512 = 0x80 |
check,
1324 avx512_xmm_avx512 = 0x100 |
check,
1325 pkeys = 0x200 |
check,
1326 all = x87 | sse | avxh | mpx | avx512_k | avx512_zmm_h
1327 | avx512_ymmh_avx512 | avx512_xmm_avx512 | pkeys
1340 regclass = avx512_zmm_h;
1343 regclass = avx512_k;
1346 regclass = avx512_ymmh_avx512;
1349 regclass = avx512_xmm_avx512;
1376 if ((regclass &
check))
1379 ULONGEST initial_xstate_bv, clear_bv, xstate_bv = 0;
1386 clear_bv = (~(initial_xstate_bv)) & tdep->
xcr0;
1442 if (regclass ==
all)
1451 if (memcmp (raw, p, 4) != 0)
1465 if (memcmp (raw, p, 32) != 0)
1468 memcpy (p, raw, 32);
1479 if (memcmp (raw, p, 8) != 0)
1494 if (memcmp (raw, p, 16) != 0)
1497 memcpy (p, raw, 16);
1505 if (memcmp (raw, p, 16) != 0)
1508 memcpy (p, raw, 16);
1520 if (memcmp (raw, p, 16))
1523 memcpy (p, raw, 16);
1533 if (memcmp (raw, p, 16))
1536 memcpy (p, raw, 16);
1547 if (memcmp (raw, p, 8))
1561 if (memcmp (raw, p, 16))
1564 memcpy (p, raw, 16);
1575 if (memcmp (raw, p, 10))
1578 memcpy (p, raw, 10);
1591 _(
"invalid i387 regclass"));
1596 if (memcmp (raw, p, 4) != 0)
1606 if (memcmp (raw, p, 32) != 0)
1609 memcpy (p, raw, 32);
1615 if (memcmp (raw, p, 8) != 0)
1622 case avx512_ymmh_avx512:
1625 if (memcmp (raw, p, 16) != 0)
1628 memcpy (p, raw, 16);
1632 case avx512_xmm_avx512:
1635 if (memcmp (raw, p, 16) != 0)
1638 memcpy (p, raw, 16);
1645 if (memcmp (raw, p, 16))
1648 memcpy (p, raw, 16);
1657 if (memcmp (raw, p, 16))
1660 memcpy (p, raw, 16);
1674 if (memcmp (raw, p, 16))
1677 memcpy (p, raw, 16);
1684 if (memcmp (raw, p, 10))
1687 memcpy (p, raw, 10);
1698 initial_xstate_bv |= xstate_bv;
1707 _(
"invalid i387 regclass"));
1718 case avx512_ymmh_avx512:
1719 case avx512_xmm_avx512:
1728 if (regclass !=
all)
1750 buf[1] &= ((1 << 3) - 1);
1757 unsigned short ftag;
1760 ftag = (buf[1] << 8) | buf[0];
1764 for (fpreg = 7; fpreg >= 0; fpreg--)
1766 int tag = (ftag >> (fpreg * 2)) & 3;
1769 buf[0] |= (1 << fpreg);
1790 unsigned int exponent;
1791 unsigned long fraction[2];
1793 integer = raw[7] & 0x80;
1794 exponent = (((raw[9] & 0x7f) << 8) | raw[8]);
1795 fraction[0] = ((raw[3] << 24) | (raw[2] << 16) | (raw[1] << 8) | raw[0]);
1796 fraction[1] = (((raw[7] & 0x7f) << 24) | (raw[6] << 16)
1797 | (raw[5] << 8) | raw[4]);
1799 if (exponent == 0x7fff)
1804 else if (exponent == 0x0000)
1806 if (fraction[0] == 0x0000 && fraction[1] == 0x0000 && !integer)
void i387_collect_fsave(const struct regcache *regcache, int regnum, void *fsave)
static int fsave_offset[]
#define I387_YMMENDH_REGNUM(tdep)
#define X86_XSTATE_BNDCFG
#define I387_FOP_REGNUM(tdep)
std::string target_float_to_string(const gdb_byte *addr, const struct type *type, const char *format)
void fputs_unfiltered(const char *buf, struct ui_file *file)
#define I387_BND0R_REGNUM(tdep)
static int xsave_avxh_offset[]
void warning(const char *fmt,...)
void i387_supply_fxsave(struct regcache *regcache, int regnum, const void *fxsave)
#define XSAVE_XMM_AVX512_ADDR(tdep, xsave, regnum)
void * memset(T *s, int c, size_t n)=delete
void internal_error(const char *file, int line, const char *fmt,...)
#define XSAVE_YMM_AVX512_ADDR(tdep, xsave, regnum)
void target_float_convert(const gdb_byte *from, const struct type *from_type, gdb_byte *to, const struct type *to_type)
#define I387_NUM_BND_REGS
int i386_fp_regnum_p(struct gdbarch *gdbarch, int regnum)
void i387_supply_fsave(struct regcache *regcache, int regnum, const void *fsave)
#define I387_YMM0H_REGNUM(tdep)
#define I387_ST0_REGNUM(tdep)
static int i387_tag(const gdb_byte *raw)
void i387_reset_bnd_regs(struct gdbarch *gdbarch, struct regcache *regcache)
struct gdbarch_tdep * gdbarch_tdep(struct gdbarch *gdbarch)
#define I387_ZMMENDH_REGNUM(tdep)
#define FSAVE_ADDR(tdep, fsave, regnum)
#define X86_XSTATE_SIZE(XCR0)
#define XSAVE_XSTATE_BV_ADDR(xsave)
void i387_value_to_register(struct frame_info *frame, int regnum, struct type *type, const gdb_byte *from)
void i387_return_value(struct gdbarch *gdbarch, struct regcache *regcache)
struct value * get_frame_register_value(struct frame_info *frame, int regnum)
#define I387_K0_REGNUM(tdep)
const gdb_byte * value_contents(struct value *value)
void i387_collect_fxsave(const struct regcache *regcache, int regnum, void *fxsave)
#define I387_FSTAT_REGNUM(tdep)
#define I387_PKEYSEND_REGNUM(tdep)
void fprintf_filtered(struct ui_file *stream, const char *format,...)
static ULONGEST extract_unsigned_integer(const gdb_byte *addr, int len, enum bfd_endian byte_order)
#define XSAVE_AVX512_ZMM_H_ADDR(tdep, xsave, regnum)
#define I387_XMM0_REGNUM(tdep)
void fputs_filtered(const char *linebuffer, struct ui_file *stream)
#define X86_XSTATE_BNDREGS
struct type * i387_ext_type(struct gdbarch *gdbarch)
enum bfd_endian gdbarch_byte_order(struct gdbarch *gdbarch)
#define I387_FISEG_REGNUM(tdep)
static void print_i387_ext(struct gdbarch *gdbarch, const gdb_byte *raw, struct ui_file *file)
#define I387_PKRU_REGNUM(tdep)
static int xsave_avx512_k_offset[]
#define I387_FTAG_REGNUM(tdep)
mach_port_t mach_port_t name mach_port_t mach_port_t name kern_return_t int status
#define I387_YMM16H_REGNUM(tdep)
#define I387_XMM16_REGNUM(tdep)
#define I387_FOSEG_REGNUM(tdep)
int i387_convert_register_p(struct gdbarch *gdbarch, int regnum, struct type *type)
#define FXSAVE_ADDR(tdep, fxsave, regnum)
static int xsave_avx512_zmm_h_offset[]
static int xsave_ymm_avx512_offset[]
void put_frame_register(struct frame_info *frame, int regnum, const gdb_byte *buf)
void i387_collect_xsave(const struct regcache *regcache, int regnum, void *xsave, int gcore)
static int fxsave_offset[]
static int xsave_xmm_avx512_offset[]
#define I387_YMMH_AVX512_END_REGNUM(tdep)
int value_entirely_available(struct value *value)
char * hex_string_custom(LONGEST num, int width)
static int xsave_mpx_offset[]
#define FXSAVE_MXCSR_ADDR(fxsave)
static void check(BOOL ok, const char *file, int line)
#define TYPE_CODE(thistype)
#define XSAVE_AVX512_K_ADDR(tdep, xsave, regnum)
void regcache_raw_write_unsigned(struct regcache *regcache, int regnum, ULONGEST val)
#define I387_BNDCFGU_REGNUM(tdep)
int read_frame_register_unsigned(struct frame_info *frame, int regnum, ULONGEST *val)
static void print_i387_status_word(int status_p, unsigned int status, struct ui_file *file)
struct m32c_reg regs[M32C_MAX_NUM_REGS]
#define XSAVE_PKEYS_ADDR(tdep, xsave, regnum)
#define I387_MXCSR_REGNUM(tdep)
#define I387_ZMM0H_REGNUM(tdep)
#define I386_MAX_REGISTER_SIZE
void regcache_raw_supply(struct regcache *regcache, int regnum, const void *buf)
int get_frame_register_bytes(struct frame_info *frame, int regnum, CORE_ADDR offset, int len, gdb_byte *myaddr, int *optimizedp, int *unavailablep)
void i387_print_float_info(struct gdbarch *gdbarch, struct ui_file *file, struct frame_info *frame, const char *args)
unsigned long long ULONGEST
int i387_register_to_value(struct frame_info *frame, int regnum, struct type *type, gdb_byte *to, int *optimizedp, int *unavailablep)
int register_size(struct gdbarch *gdbarch, int regnum)
void regcache_raw_collect(const struct regcache *regcache, int regnum, void *buf)
#define I387_FOOFF_REGNUM(tdep)
#define I387_KEND_REGNUM(tdep)
#define I387_FCTRL_REGNUM(tdep)
enum register_status regcache_raw_read_unsigned(struct regcache *regcache, int regnum, ULONGEST *val)
void i387_supply_xsave(struct regcache *regcache, int regnum, const void *xsave)
#define XSAVE_MPX_ADDR(tdep, xsave, regnum)
static void print_i387_control_word(int control_p, unsigned int control, struct ui_file *file)
struct gdbarch * get_frame_arch(struct frame_info *this_frame)
static void print_i387_value(struct gdbarch *gdbarch, const gdb_byte *raw, struct ui_file *file)
#define I387_MPXEND_REGNUM(tdep)
static void store_unsigned_integer(gdb_byte *addr, int len, enum bfd_endian byte_order, ULONGEST val)
#define XSAVE_AVXH_ADDR(tdep, xsave, regnum)
static int xsave_pkeys_offset[]
void regcache_raw_write(struct regcache *regcache, int regnum, const gdb_byte *buf)
#define I387_XMM_AVX512_END_REGNUM(tdep)
#define I387_FIOFF_REGNUM(tdep)
#define X86_XSTATE_ALL_MASK