22 #include "floatformat.h"
52 #ifdef PRINTF_HAS_LONG_DOUBLE
67 unsigned int exponent;
68 unsigned long fraction[2];
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]);
77 if (exponent == 0x7fff && integer)
79 if (fraction[0] == 0x00000000 && fraction[1] == 0x00000000)
82 else if (sign && fraction[0] == 0x00000000 && fraction[1] == 0x40000000)
85 else if (fraction[1] & 0x40000000)
92 else if (exponent < 0x7fff && exponent > 0x0000 && integer)
95 else if (exponent == 0x0000)
103 else if (fraction[0] || fraction[1])
147 " TOP: %d\n", ((status >> 11) & 7));
155 unsigned int control,
struct ui_file *file)
176 switch ((control >> 8) & 3)
193 switch ((control >> 10) & 3)
259 top = ((fstat >> 11) & 7);
261 for (fpreg = 7; fpreg >= 0; fpreg--)
263 struct value *regval;
272 tag = (ftag >> (fpreg * 2)) & 3;
301 for (i = 9; i >= 0; i--)
304 if (tag != -1 && tag != 3)
330 :
_(
"<unavailable>"));
360 int *optimizedp,
int *unavailablep)
370 warning (
_(
"Cannot convert floating-point register value "
371 "to non-floating-point type."));
372 *optimizedp = *unavailablep = 0;
378 from, optimizedp, unavailablep))
382 *optimizedp = *unavailablep = 0;
401 warning (
_(
"Cannot convert non-floating-point type "
402 "to floating-point register value."));
438 #define FSAVE_ADDR(tdep, fsave, regnum) \
439 (fsave + fsave_offset[regnum - I387_ST0_REGNUM (tdep)])
458 if (regnum == -1 || regnum == i)
476 val[1] &= ((1 << 3) - 1);
485 if (regnum == -1 || regnum == i)
487 if (regnum == -1 || regnum == I387_MXCSR_REGNUM (tdep))
511 if (regnum == -1 || regnum == i)
526 buf[1] &= ((1 << 3) - 1);
527 buf[1] |= ((
FSAVE_ADDR (tdep, regs, i))[1] & ~((1 << 3) - 1));
577 #define FXSAVE_ADDR(tdep, fxsave, regnum) \
578 (fxsave + fxsave_offset[regnum - I387_ST0_REGNUM (tdep)])
585 #define FXSAVE_MXCSR_ADDR(fxsave) (fxsave + 24)
605 if (regnum == -1 || regnum == i)
623 val[1] &= ((1 << 3) - 1);
630 unsigned long ftag = 0;
638 for (fpreg = 7; fpreg >= 0; fpreg--)
642 if (val[0] & (1 << fpreg))
644 int thisreg = (fpreg + 8 - top) % 8
651 ftag |= tag << (2 * fpreg);
653 val[0] = ftag & 0xff;
654 val[1] = (ftag >> 8) & 0xff;
662 if (regnum == I387_MXCSR_REGNUM (tdep) || regnum == -1)
688 if (regnum == -1 || regnum == i)
703 buf[1] &= ((1 << 3) - 1);
704 buf[1] |= ((
FXSAVE_ADDR (tdep, regs, i))[1] & ~((1 << 3) - 1));
713 ftag = (buf[1] << 8) | buf[0];
717 for (fpreg = 7; fpreg >= 0; fpreg--)
719 int tag = (ftag >> (fpreg * 2)) & 3;
722 buf[0] |= (1 << fpreg);
731 if (regnum == I387_MXCSR_REGNUM (tdep) || regnum == -1)
737 #define XSAVE_XSTATE_BV_ADDR(xsave) (xsave + 512)
763 #define XSAVE_AVXH_ADDR(tdep, xsave, regnum) \
764 (xsave + xsave_avxh_offset[regnum - I387_YMM0H_REGNUM (tdep)])
791 #define XSAVE_YMM_AVX512_ADDR(tdep, xsave, regnum) \
792 (xsave + xsave_ymm_avx512_offset[regnum - I387_YMM16H_REGNUM (tdep)])
814 #define XSAVE_XMM_AVX512_ADDR(tdep, xsave, regnum) \
815 (xsave + xsave_xmm_avx512_offset[regnum - I387_XMM16_REGNUM (tdep)])
826 #define XSAVE_MPX_ADDR(tdep, xsave, regnum) \
827 (xsave + xsave_mpx_offset[regnum - I387_BND0R_REGNUM (tdep)])
845 #define XSAVE_AVX512_K_ADDR(tdep, xsave, regnum) \
846 (xsave + xsave_avx512_k_offset[regnum - I387_K0_REGNUM (tdep)])
888 #define XSAVE_AVX512_ZMM_H_ADDR(tdep, xsave, regnum) \
889 (xsave + xsave_avx512_zmm_h_offset[regnum - I387_ZMM0H_REGNUM (tdep)])
901 unsigned int clear_bv;
912 avx512_ymmh_avx512 = 0x40,
913 avx512_xmm_avx512 = 0x80,
914 all = x87 | sse | avxh | mpx | avx512_k | avx512_zmm_h
915 | avx512_ymmh_avx512 | avx512_xmm_avx512
926 regclass = avx512_zmm_h;
932 regclass = avx512_ymmh_avx512;
935 regclass = avx512_xmm_avx512;
951 if (regclass != none)
958 clear_bv = (~(*xstate_bv_p)) & tdep->
xcr0;
993 case avx512_ymmh_avx512:
1001 case avx512_xmm_avx512:
1002 if ((clear_bv & X86_XSTATE_ZMM))
1063 if ((tdep->
xcr0 & X86_XSTATE_K))
1065 if ((clear_bv & X86_XSTATE_K))
1083 if ((tdep->
xcr0 & X86_XSTATE_ZMM))
1085 if ((clear_bv & X86_XSTATE_ZMM))
1111 if ((tdep->
xcr0 & X86_XSTATE_AVX))
1113 if ((clear_bv & X86_XSTATE_AVX))
1131 if ((tdep->
xcr0 & X86_XSTATE_BNDREGS))
1133 if (clear_bv & X86_XSTATE_BNDREGS)
1167 if ((tdep->
xcr0 & X86_XSTATE_SSE))
1169 if ((clear_bv & X86_XSTATE_SSE))
1186 if ((tdep->
xcr0 & X86_XSTATE_X87))
1188 if ((clear_bv & X86_XSTATE_X87))
1208 if (regnum == -1 || regnum == i)
1218 val[2] = val[3] = 0;
1220 val[1] &= ((1 << 3) - 1);
1227 unsigned long ftag = 0;
1235 for (fpreg = 7; fpreg >= 0; fpreg--)
1239 if (val[0] & (1 << fpreg))
1241 int thisreg = (fpreg + 8 - top) % 8
1248 ftag |= tag << (2 * fpreg);
1250 val[0] = ftag & 0xff;
1251 val[1] = (ftag >> 8) & 0xff;
1268 void *xsave,
int gcore)
1282 avx512_k = 0x20 |
check,
1283 avx512_zmm_h = 0x40 |
check,
1284 avx512_ymmh_avx512 = 0x80 |
check,
1285 avx512_xmm_avx512 = 0x100 |
check,
1286 all = x87 | sse | avxh | mpx | avx512_k | avx512_zmm_h
1287 | avx512_ymmh_avx512 | avx512_xmm_avx512
1297 regclass = avx512_zmm_h;
1300 regclass = avx512_k;
1303 regclass = avx512_ymmh_avx512;
1306 regclass = avx512_xmm_avx512;
1333 if ((regclass &
check))
1337 unsigned int xstate_bv = 0;
1339 unsigned int clear_bv = (~(*xstate_bv_p)) & tdep->
xcr0;
1351 for (i = I387_BNDCFGU_REGNUM (tdep);
1391 if (regclass ==
all)
1400 if (memcmp (raw, p, 32) != 0)
1403 memcpy (p, raw, 32);
1414 if (memcmp (raw, p, 8) != 0)
1429 if (memcmp (raw, p, 16) != 0)
1432 memcpy (p, raw, 16);
1440 if (memcmp (raw, p, 16) != 0)
1443 memcpy (p, raw, 16);
1455 if (memcmp (raw, p, 16))
1458 memcpy (p, raw, 16);
1468 if (memcmp (raw, p, 16))
1471 memcpy (p, raw, 16);
1477 for (i = I387_BNDCFGU_REGNUM (tdep);
1482 if (memcmp (raw, p, 8))
1496 if (memcmp (raw, p, 16))
1499 memcpy (p, raw, 16);
1510 if (memcmp (raw, p, 10))
1513 memcpy (p, raw, 10);
1526 _(
"invalid i387 regclass"));
1531 if (memcmp (raw, p, 32) != 0)
1534 memcpy (p, raw, 32);
1540 if (memcmp (raw, p, 8) != 0)
1547 case avx512_ymmh_avx512:
1550 if (memcmp (raw, p, 16) != 0)
1553 memcpy (p, raw, 16);
1557 case avx512_xmm_avx512:
1560 if (memcmp (raw, p, 16) != 0)
1563 memcpy (p, raw, 16);
1570 if (memcmp (raw, p, 16))
1573 memcpy (p, raw, 16);
1582 if (memcmp (raw, p, 16))
1585 memcpy (p, raw, 16);
1599 if (memcmp (raw, p, 16))
1602 memcpy (p, raw, 16);
1609 if (memcmp (raw, p, 10))
1612 memcpy (p, raw, 10);
1623 *xstate_bv_p |= (
gdb_byte) xstate_bv;
1629 _(
"invalid i387 regclass"));
1640 case avx512_ymmh_avx512:
1641 case avx512_xmm_avx512:
1649 if (regclass !=
all)
1656 if (regnum == -1 || regnum == i)
1671 buf[1] &= ((1 << 3) - 1);
1672 buf[1] |= ((
FXSAVE_ADDR (tdep, regs, i))[1] & ~((1 << 3) - 1));
1678 unsigned short ftag;
1681 ftag = (buf[1] << 8) | buf[0];
1685 for (fpreg = 7; fpreg >= 0; fpreg--)
1687 int tag = (ftag >> (fpreg * 2)) & 3;
1690 buf[0] |= (1 << fpreg);
1711 unsigned int exponent;
1712 unsigned long fraction[2];
1714 integer = raw[7] & 0x80;
1715 exponent = (((raw[9] & 0x7f) << 8) | raw[8]);
1716 fraction[0] = ((raw[3] << 24) | (raw[2] << 16) | (raw[1] << 8) | raw[0]);
1717 fraction[1] = (((raw[7] & 0x7f) << 24) | (raw[6] << 16)
1718 | (raw[5] << 8) | raw[4]);
1720 if (exponent == 0x7fff)
1725 else if (exponent == 0x0000)
1727 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)
void fputs_unfiltered(const char *buf, struct ui_file *file)
#define I387_BND0R_REGNUM(tdep)
static int xsave_avxh_offset[]
struct gdbarch * get_regcache_arch(const struct regcache *regcache)
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 convert_typed_floating(const void *from, const struct type *from_type, void *to, const struct type *to_type)
void internal_error(const char *file, int line, const char *fmt,...)
#define XSAVE_YMM_AVX512_ADDR(tdep, xsave, regnum)
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)
struct gdbarch_tdep * gdbarch_tdep(struct gdbarch *gdbarch)
#define I387_ZMMENDH_REGNUM(tdep)
DOUBLEST extract_typed_floating(const void *addr, const struct type *type)
#define FSAVE_ADDR(tdep, fsave, regnum)
#define X86_XSTATE_SIZE(XCR0)
void store_unsigned_integer(gdb_byte *, int, enum bfd_endian, ULONGEST)
#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)
void fprintf_filtered(struct ui_file *stream, const char *format,...)
#define XSAVE_AVX512_ZMM_H_ADDR(tdep, xsave, regnum)
#define I387_XMM0_REGNUM(tdep)
mach_port_t mach_port_t name mach_port_t mach_port_t name error_t int status
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)
static int xsave_avx512_k_offset[]
#define I387_FTAG_REGNUM(tdep)
enum register_status regcache_raw_read_unsigned(struct regcache *regcache, int regnum, ULONGEST *val)
#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 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)
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)
#define TYPE_LENGTH(thistype)
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)
#define XSAVE_AVXH_ADDR(tdep, xsave, regnum)
#define I387_XMM_AVX512_END_REGNUM(tdep)
#define I387_FIOFF_REGNUM(tdep)
#define X86_XSTATE_ALL_MASK