diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2010-04-07 18:43:45 +0000 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2010-04-07 18:43:45 +0000 |
commit | c131fcee79bd9082762a1699a657949771fa245f (patch) | |
tree | 3b3f41a8026f682bd2c2f04477fd8f66ce2b6545 /gdb/i386-tdep.h | |
parent | 98adf0f383f6c4087ff347b207e4aad8a139994b (diff) | |
download | gdb-c131fcee79bd9082762a1699a657949771fa245f.zip gdb-c131fcee79bd9082762a1699a657949771fa245f.tar.gz gdb-c131fcee79bd9082762a1699a657949771fa245f.tar.bz2 |
Support i386 AVX.
2010-04-07 H.J. Lu <hongjiu.lu@intel.com>
* i386-linux-nat.c: Include "regset.h", "elf/common.h",
<sys/uio.h> and "i386-xstate.h".
(PTRACE_GETREGSET): New.
(PTRACE_SETREGSET): Likewise.
(fetch_xstateregs): Likewise.
(store_xstateregs): Likewise.
(GETXSTATEREGS_SUPPLIES): Likewise.
(regmap): Include 8 upper YMM registers.
(i386_linux_fetch_inferior_registers): Support XSAVE extended
state.
(i386_linux_store_inferior_registers): Likewise.
(i386_linux_read_description): Check and enable AVX target
descriptions.
* i386-linux-tdep.c: Include "regset.h", "i387-tdep.h",
"i386-xstate.h" and "features/i386/i386-avx-linux.c".
(i386_linux_regset_sections): Add ".reg-xstate".
(i386_linux_gregset_reg_offset): Include 8 upper YMM registers.
(i386_linux_core_read_xcr0): New.
(i386_linux_core_read_description): Check and enable AVX target
description.
(i386_linux_init_abi): Set xsave_xcr0_offset.
(_initialize_i386_linux_tdep): Call
initialize_tdesc_i386_avx_linux.
* i386-linux-tdep.h (I386_LINUX_ORIG_EAX_REGNUM): Replace
I386_SSE_NUM_REGS with I386_AVX_NUM_REGS.
(i386_linux_core_read_xcr0): New.
(tdesc_i386_avx_linux): Likewise.
(I386_LINUX_XSAVE_XCR0_OFFSET): Likewise.
* i386-tdep.c: Include "i386-xstate.h" and
"features/i386/i386-avx.c".
(i386_ymm_names): New.
(i386_ymmh_names): Likewise.
(i386_ymmh_regnum_p): Likewise.
(i386_ymm_regnum_p): Likewise.
(i386_xmm_regnum_p): Likewise.
(i386_register_name): Likewise.
(i386_ymm_type): Likewise.
(i386_supply_xstateregset): Likewise.
(i386_collect_xstateregset): Likewise.
(i386_sse_regnum_p): Removed.
(i386_pseudo_register_name): Support pseudo YMM registers.
(i386_pseudo_register_type): Likewise.
(i386_pseudo_register_read): Likewise.
(i386_pseudo_register_write): Likewise.
(i386_dbx_reg_to_regnum): Return %ymmN register number for
%xmmN if AVX is available.
(i386_regset_from_core_section): Support .reg-xstate section.
(i386_register_reggroup_p): Supper upper YMM and YMM registers.
(i386_process_record): Replace i386_sse_regnum_p with
i386_xmm_regnum_p.
(i386_validate_tdesc_p): Support org.gnu.gdb.i386.avx feature.
Set ymmh_register_names, num_ymm_regs, ymm0h_regnum and xcr0.
(i386_gdbarch_init): Set xstateregset. Set xsave_xcr0_offset.
Call set_gdbarch_register_name. Replace I386_SSE_NUM_REGS with
I386_AVX_NUM_REGS. Set ymmh_register_names, ymm0h_regnum and
num_ymm_regs. Add num_ymm_regs to set_gdbarch_num_pseudo_regs.
Set ymm0_regnum.
(_initialize_i386_tdep): Call initialize_tdesc_i386_avx.
* i386-tdep.h (gdbarch_tdep): Add xstateregset, ymm0_regnum,
xcr0, xsave_xcr0_offset, ymm0h_regnum, ymmh_register_names and
i386_ymm_type.
(i386_regnum): Add I386_YMM0H_REGNUM, and I386_YMM7H_REGNUM.
(I386_AVX_NUM_REGS): New.
(i386_xmm_regnum_p): Likewise.
(i386_ymm_regnum_p): Likewise.
(i386_ymmh_regnum_p): Likewise.
* common/i386-xstate.h: New.
Diffstat (limited to 'gdb/i386-tdep.h')
-rw-r--r-- | gdb/i386-tdep.h | 34 |
1 files changed, 33 insertions, 1 deletions
diff --git a/gdb/i386-tdep.h b/gdb/i386-tdep.h index 72c634e..6520d67 100644 --- a/gdb/i386-tdep.h +++ b/gdb/i386-tdep.h @@ -109,6 +109,9 @@ struct gdbarch_tdep struct regset *fpregset; size_t sizeof_fpregset; + /* XSAVE extended state. */ + struct regset *xstateregset; + /* Register number for %st(0). The register numbers for the other registers follow from this one. Set this to -1 to indicate the absence of an FPU. */ @@ -121,6 +124,13 @@ struct gdbarch_tdep of MMX support. */ int mm0_regnum; + /* Number of pseudo YMM registers. */ + int num_ymm_regs; + + /* Register number for %ymm0. Set this to -1 to indicate the absence + of pseudo YMM register support. */ + int ymm0_regnum; + /* Number of byte registers. */ int num_byte_regs; @@ -146,9 +156,24 @@ struct gdbarch_tdep /* Number of SSE registers. */ int num_xmm_regs; + /* Bits of the extended control register 0 (the XFEATURE_ENABLED_MASK + register), excluding the x87 bit, which are supported by this GDB. + */ + uint64_t xcr0; + + /* Offset of XCR0 in XSAVE extended state. */ + int xsave_xcr0_offset; + /* Register names. */ const char **register_names; + /* Register number for %ymm0h. Set this to -1 to indicate the absence + of upper YMM register support. */ + int ymm0h_regnum; + + /* Upper YMM register names. Only used for tdesc_numbered_register. */ + const char **ymmh_register_names; + /* Target description. */ const struct target_desc *tdesc; @@ -182,6 +207,7 @@ struct gdbarch_tdep /* ISA-specific data types. */ struct type *i386_mmx_type; + struct type *i386_ymm_type; struct type *i387_ext_type; /* Process record/replay target. */ @@ -228,7 +254,9 @@ enum i386_regnum I386_FS_REGNUM, /* %fs */ I386_GS_REGNUM, /* %gs */ I386_ST0_REGNUM, /* %st(0) */ - I386_MXCSR_REGNUM = 40 /* %mxcsr */ + I386_MXCSR_REGNUM = 40, /* %mxcsr */ + I386_YMM0H_REGNUM, /* %ymm0h */ + I386_YMM7H_REGNUM = I386_YMM0H_REGNUM + 7 }; /* Register numbers of RECORD_REGMAP. */ @@ -265,6 +293,7 @@ enum record_i386_regnum #define I386_NUM_XREGS 9 #define I386_SSE_NUM_REGS (I386_MXCSR_REGNUM + 1) +#define I386_AVX_NUM_REGS (I386_YMM7H_REGNUM + 1) /* Size of the largest register. */ #define I386_MAX_REGISTER_SIZE 16 @@ -276,6 +305,9 @@ extern struct type *i387_ext_type (struct gdbarch *gdbarch); extern int i386_byte_regnum_p (struct gdbarch *gdbarch, int regnum); extern int i386_word_regnum_p (struct gdbarch *gdbarch, int regnum); extern int i386_dword_regnum_p (struct gdbarch *gdbarch, int regnum); +extern int i386_xmm_regnum_p (struct gdbarch *gdbarch, int regnum); +extern int i386_ymm_regnum_p (struct gdbarch *gdbarch, int regnum); +extern int i386_ymmh_regnum_p (struct gdbarch *gdbarch, int regnum); extern const char *i386_pseudo_register_name (struct gdbarch *gdbarch, int regnum); |