* [rfc] Replace x86 register macros
@ 2008-02-18 20:42 Markus Deuling
2008-02-19 15:45 ` Ulrich Weigand
0 siblings, 1 reply; 9+ messages in thread
From: Markus Deuling @ 2008-02-18 20:42 UTC (permalink / raw)
To: GDB Patches; +Cc: Ulrich Weigand
[-- Attachment #1: Type: text/plain, Size: 1055 bytes --]
Hi,
in some places used by x86/amd64 architecture there is a weird mechanism to
get at the number of registers or the registers themselves which make the code hard to
read.
One example is i386_sse_regnum_p in i386-tdep.c where two macros I387_ST0_REGNUM and
I387_NUM_XMM_REGS have to be defined so that other two macros I387_XMM0_REGNUM and
I387_MXCSR_REGNUM are valid.
What I'd like to do is to unknot this source to make it more readable. For my opinion
it is bad practice to define and undef macros per funtion in a source file describing a target.
What do you think about this in general and about this patch in special? If this would be a way to
go I'd like to commit this patch and come up with a bigger one to handle some more of these.
Testsuite on x86 showed no regression.
ChangeLog:
* i386-tdep.c (i386_sse_regnum_p): Replace I387_XMM0_REGNUM and
I387_MXCSR_REGNUM by its expressions. Remove I387_ST0_REGNUM and
I387_NUM_XMM_REGS.
Regards,
Markus
--
Markus Deuling
GNU Toolchain for Linux on Cell BE
deuling@de.ibm.com
[-- Attachment #2: diff-i386 --]
[-- Type: text/plain, Size: 751 bytes --]
diff -urpN src/gdb/i386-tdep.c dev/gdb/i386-tdep.c
--- src/gdb/i386-tdep.c 2008-01-27 06:30:37.000000000 +0100
+++ dev/gdb/i386-tdep.c 2008-02-18 21:26:40.000000000 +0100
@@ -96,16 +96,9 @@ i386_sse_regnum_p (struct gdbarch *gdbar
{
struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
-#define I387_ST0_REGNUM tdep->st0_regnum
-#define I387_NUM_XMM_REGS tdep->num_xmm_regs
-
- if (I387_NUM_XMM_REGS == 0)
- return 0;
-
- return (I387_XMM0_REGNUM <= regnum && regnum < I387_MXCSR_REGNUM);
-
-#undef I387_ST0_REGNUM
-#undef I387_NUM_XMM_REGS
+ /* True if REGNUM in [st0_regnum + 16, st0_regnum + 16 + num_xmm_regs). */
+ return (regnum >= tdep->st0_regnum + 16
+ && regnum < tdep->st0_regnum + 16 + tdep->num_xmm_regs);
}
static int
^ permalink raw reply [flat|nested] 9+ messages in thread* Re: [rfc] Replace x86 register macros 2008-02-18 20:42 [rfc] Replace x86 register macros Markus Deuling @ 2008-02-19 15:45 ` Ulrich Weigand 2008-02-19 16:21 ` Daniel Jacobowitz 2008-02-20 16:45 ` Markus Deuling 0 siblings, 2 replies; 9+ messages in thread From: Ulrich Weigand @ 2008-02-19 15:45 UTC (permalink / raw) To: Markus Deuling; +Cc: GDB Patches Markus Deuling wrote: > in some places used by x86/amd64 architecture there is a weird mechanism to > get at the number of registers or the registers themselves which make the code hard to > read. > > One example is i386_sse_regnum_p in i386-tdep.c where two macros I387_ST0_REGNUM and > I387_NUM_XMM_REGS have to be defined so that other two macros I387_XMM0_REGNUM and > I387_MXCSR_REGNUM are valid. This was intended as a way to support both i386 and amd64 with the same code, even though register numbers differ. See the comment in i387-tdep.h: /* Because the number of general-purpose registers is different for AMD64, the floating-point registers and SSE registers get shifted. The following definitions are intended to help writing code that needs the register numbers of floating-point registers and SSE registers. In order to use these, one should provide a definition for I387_ST0_REGNUM, and possibly I387_NUM_XMM_REGS, preferably by using a local "#define" in the body of the function that uses this. Please "#undef" them before the end of the function. */ #define I387_FCTRL_REGNUM (I387_ST0_REGNUM + 8) #define I387_FSTAT_REGNUM (I387_FCTRL_REGNUM + 1) #define I387_FTAG_REGNUM (I387_FCTRL_REGNUM + 2) #define I387_FISEG_REGNUM (I387_FCTRL_REGNUM + 3) #define I387_FIOFF_REGNUM (I387_FCTRL_REGNUM + 4) #define I387_FOSEG_REGNUM (I387_FCTRL_REGNUM + 5) #define I387_FOOFF_REGNUM (I387_FCTRL_REGNUM + 6) #define I387_FOP_REGNUM (I387_FCTRL_REGNUM + 7) #define I387_XMM0_REGNUM (I387_ST0_REGNUM + 16) #define I387_MXCSR_REGNUM (I387_XMM0_REGNUM + I387_NUM_XMM_REGS) I agree that it would be nicer to handle this in a different fashion, but I don't like this approach either: > - return (I387_XMM0_REGNUM <= regnum && regnum < I387_MXCSR_REGNUM); > + /* True if REGNUM in [st0_regnum + 16, st0_regnum + 16 + num_xmm_regs). */ > + return (regnum >= tdep->st0_regnum + 16 > + && regnum < tdep->st0_regnum + 16 + tdep->num_xmm_regs); This leads to hard-coding those magic numbers like 16 all over the place. Having a symbolic name for these is much better. I'd suggest to keep the I387_..._REGNUM macros, but add a tdep parameter to them. All users would need to be changed to pass in the proper tdep, but that only makes the existing dependency explicit. #define I387_FCTRL_REGNUM(tdep) ((tdep)->st0_regnum + 8) #define I387_FSTAT_REGNUM(tdep) (I387_FCTRL_REGNUM (tdep) + 1) ... Bye, Ulrich -- Dr. Ulrich Weigand GNU Toolchain for Linux on System z and Cell BE Ulrich.Weigand@de.ibm.com ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [rfc] Replace x86 register macros 2008-02-19 15:45 ` Ulrich Weigand @ 2008-02-19 16:21 ` Daniel Jacobowitz 2008-02-20 16:45 ` Markus Deuling 1 sibling, 0 replies; 9+ messages in thread From: Daniel Jacobowitz @ 2008-02-19 16:21 UTC (permalink / raw) To: Ulrich Weigand; +Cc: Markus Deuling, GDB Patches On Tue, Feb 19, 2008 at 04:44:37PM +0100, Ulrich Weigand wrote: > I'd suggest to keep the I387_..._REGNUM macros, but add a tdep > parameter to them. All users would need to be changed to pass > in the proper tdep, but that only makes the existing dependency > explicit. Alternatively, use fixed numbers for all of these registers and use nameless int0_t registers for any missing from the current gdbarch Then only the register name and type depend on the tdep, not the register number. -- Daniel Jacobowitz CodeSourcery ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [rfc] Replace x86 register macros 2008-02-19 15:45 ` Ulrich Weigand 2008-02-19 16:21 ` Daniel Jacobowitz @ 2008-02-20 16:45 ` Markus Deuling 2008-03-04 0:32 ` Ulrich Weigand 1 sibling, 1 reply; 9+ messages in thread From: Markus Deuling @ 2008-02-20 16:45 UTC (permalink / raw) To: GDB Patches; +Cc: Ulrich Weigand, Daniel Jacobowitz [-- Attachment #1: Type: text/plain, Size: 2613 bytes --] Ulrich Weigand schrieb: > Markus Deuling wrote: place. Having a symbolic name for these is much better. > > I'd suggest to keep the I387_..._REGNUM macros, but add a tdep > parameter to them. All users would need to be changed to pass > in the proper tdep, but that only makes the existing dependency > explicit. > > #define I387_FCTRL_REGNUM(tdep) ((tdep)->st0_regnum + 8) > #define I387_FSTAT_REGNUM(tdep) (I387_FCTRL_REGNUM (tdep) + 1) > .... Hi, thanks both for your input. I reworked the patch now. Tested on x86 without regressions Maybe someone can run a test on amd64 as I don't have such a machine? ChangeLog: * amd64-tdep.c (I387_ST0_REGNUM): Remove define. (amd64_supply_fxsave, amd64_collect_fxsave): Use get_regcache_arch to get at the current architecture (I387_FISEG_REGNUM, I387_FOSEG_REGNUM): Add target specific vector as parameter. * i386-tdep.c: Remove various define's and undef's of I387_ST0_REGNUM, I387_NUM_XMM_REGS and I387_MM0_REGNUM. (I387_NUM_XMM_REGS, I387_XMM0_REGNUM, I387_MXCSR_REGNUM, I387_ST0_REGNUM, I387_FCTRL_REGNUM, I387_MM0_REGNUM, (I387_FSTAT_REGNUM): Add target specific vector as parameter. (i386_register_name, i386_dbx_reg_to_regnum): Use gdbarch_tdep to get at the target specific vector. (i386_get_longjmp_target): Use get_frame_arch to get at the current architecture. Use gdbarch_tdep to get at the target specific vector. (i386_fp_regnum_p, i386_fpc_regnum_p): Add gdbarch as parameter and update caller. Use gdbarch_tdep to get at the target specific vector. (i386_register_to_value: Use get_frame_arch to get at the current architecture. * i386-tdep.h (i386_fp_regnum_p, i386_fpc_regnum_p): Add gdbarch as parameter. * i387-tdep.c (I387_FCTRL_REGNUM, I387_FSTAT_REGNUM, I387_FTAG_REGNUM, I387_FISEG_REGNUM, I387_FIOFF_REGNUM, I387_FOSEG_REGNUM I387_FOOFF_REGNUM, I387_FOP_REGNUM, I387_ST0_REGNUM, FSAVE_ADDR, FXSAVE_ADDR, I387_XMM0_REGNUM): Add target specific vector as parameter. (I387_ST0_REGNUM, I387_NUM_XMM_REGS): Remove various define's and undef's. (i387_convert_register_p, i387_register_to_value, i387_value_to_register): Update call for i386_fp_regnum_p. * i387-tdep.h: Remove comment. (I387_ST0_REGNUM, I387_NUM_XMM_REGS, I387_MM0_REGNUM): Add define. (I387_FCTRL_REGNUM, I387_FSTAT_REGNUM, I387_FTAG_REGNUM, I387_FISEG_REGNUM, I387_FIOFF_REGNUM, I387_FOSEG_REGNUM, I387_FOOFF_REGNUM, I387_FOP_REGNUM, I387_XMM0_REGNUM, I387_MXCSR_REGNUM): Add target specific vector as parameter. Regards, Markus -- Markus Deuling GNU Toolchain for Linux on Cell BE deuling@de.ibm.com [-- Attachment #2: diff-x86-macros --] [-- Type: text/plain, Size: 29480 bytes --] diff -urpN src/gdb/amd64-tdep.c dev/gdb/amd64-tdep.c --- src/gdb/amd64-tdep.c 2008-01-30 05:38:47.000000000 +0100 +++ dev/gdb/amd64-tdep.c 2008-02-20 17:24:13.000000000 +0100 @@ -1173,8 +1173,6 @@ amd64_init_abi (struct gdbarch_info info } \f -#define I387_ST0_REGNUM AMD64_ST0_REGNUM - /* The 64-bit FXSAVE format differs from the 32-bit format in the sense that the instruction pointer and data pointer are simply 64-bit offsets into the code segment and the data segment instead @@ -1189,18 +1187,21 @@ amd64_init_abi (struct gdbarch_info info void amd64_supply_fxsave (struct regcache *regcache, int regnum, - const void *fxsave) + const void *fxsave) { + struct gdbarch *gdbarch = get_regcache_arch (regcache); + struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); + i387_supply_fxsave (regcache, regnum, fxsave); - if (fxsave && gdbarch_ptr_bit (get_regcache_arch (regcache)) == 64) + if (fxsave && gdbarch_ptr_bit (gdbarch) == 64) { const gdb_byte *regs = fxsave; - if (regnum == -1 || regnum == I387_FISEG_REGNUM) - regcache_raw_supply (regcache, I387_FISEG_REGNUM, regs + 12); - if (regnum == -1 || regnum == I387_FOSEG_REGNUM) - regcache_raw_supply (regcache, I387_FOSEG_REGNUM, regs + 20); + if (regnum == -1 || regnum == I387_FISEG_REGNUM (tdep)) + regcache_raw_supply (regcache, I387_FISEG_REGNUM (tdep), regs + 12); + if (regnum == -1 || regnum == I387_FOSEG_REGNUM (tdep)) + regcache_raw_supply (regcache, I387_FOSEG_REGNUM (tdep), regs + 20); } } @@ -1213,15 +1214,17 @@ void amd64_collect_fxsave (const struct regcache *regcache, int regnum, void *fxsave) { + struct gdbarch *gdbarch = get_regcache_arch (regcache); + struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); gdb_byte *regs = fxsave; i387_collect_fxsave (regcache, regnum, fxsave); - if (gdbarch_ptr_bit (get_regcache_arch (regcache)) == 64) + if (gdbarch_ptr_bit (gdbarch) == 64) { - if (regnum == -1 || regnum == I387_FISEG_REGNUM) - regcache_raw_collect (regcache, I387_FISEG_REGNUM, regs + 12); - if (regnum == -1 || regnum == I387_FOSEG_REGNUM) - regcache_raw_collect (regcache, I387_FOSEG_REGNUM, regs + 20); + if (regnum == -1 || regnum == I387_FISEG_REGNUM (tdep)) + regcache_raw_collect (regcache, I387_FISEG_REGNUM (tdep), regs + 12); + if (regnum == -1 || regnum == I387_FOSEG_REGNUM (tdep)) + regcache_raw_collect (regcache, I387_FOSEG_REGNUM (tdep), regs + 20); } } diff -urpN src/gdb/i386-tdep.c dev/gdb/i386-tdep.c --- src/gdb/i386-tdep.c 2008-01-27 06:30:37.000000000 +0100 +++ dev/gdb/i386-tdep.c 2008-02-20 17:24:28.000000000 +0100 @@ -96,16 +96,11 @@ i386_sse_regnum_p (struct gdbarch *gdbar { struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); -#define I387_ST0_REGNUM tdep->st0_regnum -#define I387_NUM_XMM_REGS tdep->num_xmm_regs - - if (I387_NUM_XMM_REGS == 0) + if (I387_NUM_XMM_REGS (tdep) == 0) return 0; - return (I387_XMM0_REGNUM <= regnum && regnum < I387_MXCSR_REGNUM); - -#undef I387_ST0_REGNUM -#undef I387_NUM_XMM_REGS + return (I387_XMM0_REGNUM (tdep) <= regnum + && regnum < I387_MXCSR_REGNUM (tdep)); } static int @@ -113,40 +108,36 @@ i386_mxcsr_regnum_p (struct gdbarch *gdb { struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); -#define I387_ST0_REGNUM tdep->st0_regnum -#define I387_NUM_XMM_REGS tdep->num_xmm_regs - - if (I387_NUM_XMM_REGS == 0) + if (I387_NUM_XMM_REGS (tdep) == 0) return 0; - return (regnum == I387_MXCSR_REGNUM); - -#undef I387_ST0_REGNUM -#undef I387_NUM_XMM_REGS + return (regnum == I387_MXCSR_REGNUM (tdep)); } -#define I387_ST0_REGNUM (gdbarch_tdep (current_gdbarch)->st0_regnum) -#define I387_MM0_REGNUM (gdbarch_tdep (current_gdbarch)->mm0_regnum) -#define I387_NUM_XMM_REGS (gdbarch_tdep (current_gdbarch)->num_xmm_regs) - /* FP register? */ int -i386_fp_regnum_p (int regnum) +i386_fp_regnum_p (struct gdbarch *gdbarch, int regnum) { - if (I387_ST0_REGNUM < 0) + struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); + + if (I387_ST0_REGNUM (tdep) < 0) return 0; - return (I387_ST0_REGNUM <= regnum && regnum < I387_FCTRL_REGNUM); + return (I387_ST0_REGNUM (tdep) <= regnum + && regnum < I387_FCTRL_REGNUM (tdep)); } int -i386_fpc_regnum_p (int regnum) +i386_fpc_regnum_p (struct gdbarch *gdbarch, int regnum) { - if (I387_ST0_REGNUM < 0) + struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); + + if (I387_ST0_REGNUM (tdep) < 0) return 0; - return (I387_FCTRL_REGNUM <= regnum && regnum < I387_XMM0_REGNUM); + return (I387_FCTRL_REGNUM (tdep) <= regnum + && regnum < I387_XMM0_REGNUM (tdep)); } /* Return the name of register REGNUM. */ @@ -155,7 +146,7 @@ const char * i386_register_name (struct gdbarch *gdbarch, int regnum) { if (i386_mmx_regnum_p (gdbarch, regnum)) - return i386_mmx_names[regnum - I387_MM0_REGNUM]; + return i386_mmx_names[regnum - I387_MM0_REGNUM (gdbarch_tdep (gdbarch))]; if (regnum >= 0 && regnum < i386_num_register_names) return i386_register_names[regnum]; @@ -169,6 +160,8 @@ i386_register_name (struct gdbarch *gdba static int i386_dbx_reg_to_regnum (struct gdbarch *gdbarch, int reg) { + struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); + /* This implements what GCC calls the "default" register map (dbx_register_map[]). */ @@ -185,17 +178,17 @@ i386_dbx_reg_to_regnum (struct gdbarch * else if (reg >= 12 && reg <= 19) { /* Floating-point registers. */ - return reg - 12 + I387_ST0_REGNUM; + return reg - 12 + I387_ST0_REGNUM (tdep); } else if (reg >= 21 && reg <= 28) { /* SSE registers. */ - return reg - 21 + I387_XMM0_REGNUM; + return reg - 21 + I387_XMM0_REGNUM (tdep); } else if (reg >= 29 && reg <= 36) { /* MMX registers. */ - return reg - 29 + I387_MM0_REGNUM; + return reg - 29 + I387_MM0_REGNUM (tdep); } /* This will hopefully provoke a warning. */ @@ -208,6 +201,8 @@ i386_dbx_reg_to_regnum (struct gdbarch * static int i386_svr4_reg_to_regnum (struct gdbarch *gdbarch, int reg) { + struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); + /* This implements the GCC register map that tries to be compatible with the SVR4 C compiler for DWARF (svr4_dbx_register_map[]). */ @@ -221,7 +216,7 @@ i386_svr4_reg_to_regnum (struct gdbarch else if (reg >= 11 && reg <= 18) { /* Floating-point registers. */ - return reg - 11 + I387_ST0_REGNUM; + return reg - 11 + I387_ST0_REGNUM (tdep); } else if (reg >= 21 && reg <= 36) { @@ -231,9 +226,9 @@ i386_svr4_reg_to_regnum (struct gdbarch switch (reg) { - case 37: return I387_FCTRL_REGNUM; - case 38: return I387_FSTAT_REGNUM; - case 39: return I387_MXCSR_REGNUM; + case 37: return I387_FCTRL_REGNUM (tdep); + case 38: return I387_FSTAT_REGNUM (tdep); + case 39: return I387_MXCSR_REGNUM (tdep); case 40: return I386_ES_REGNUM; case 41: return I386_CS_REGNUM; case 42: return I386_SS_REGNUM; @@ -246,9 +241,6 @@ i386_svr4_reg_to_regnum (struct gdbarch return gdbarch_num_regs (gdbarch) + gdbarch_num_pseudo_regs (gdbarch); } -#undef I387_ST0_REGNUM -#undef I387_MM0_REGNUM -#undef I387_NUM_XMM_REGS \f /* This is the variable that is set with "set disassembly-flavor", and @@ -1312,7 +1304,8 @@ i386_get_longjmp_target (struct frame_in { gdb_byte buf[8]; CORE_ADDR sp, jb_addr; - int jb_pc_offset = gdbarch_tdep (get_frame_arch (frame))->jb_pc_offset; + struct gdbarch *gdbarch = get_frame_arch (frame); + int jb_pc_offset = gdbarch_tdep (gdbarch)->jb_pc_offset; int len = TYPE_LENGTH (builtin_type_void_func_ptr); /* If JB_PC_OFFSET is -1, we have no way to find out where the @@ -1322,7 +1315,7 @@ i386_get_longjmp_target (struct frame_in /* Don't use I386_ESP_REGNUM here, since this function is also used for AMD64. */ - get_frame_register (frame, gdbarch_sp_regnum (get_frame_arch (frame)), buf); + get_frame_register (frame, gdbarch_sp_regnum (gdbarch), buf); sp = extract_typed_address (buf, builtin_type_void_data_ptr); if (target_read_memory (sp + len, buf, len)) return 0; @@ -1459,10 +1452,6 @@ i386_store_return_value (struct gdbarch struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); int len = TYPE_LENGTH (type); - /* Define I387_ST0_REGNUM such that we use the proper definitions - for the architecture. */ -#define I387_ST0_REGNUM I386_ST0_REGNUM - if (TYPE_CODE (type) == TYPE_CODE_FLT) { ULONGEST fstat; @@ -1489,14 +1478,14 @@ i386_store_return_value (struct gdbarch actual value doesn't really matter, but 7 is what a normal function return would end up with if the program started out with a freshly initialized FPU. */ - regcache_raw_read_unsigned (regcache, I387_FSTAT_REGNUM, &fstat); + regcache_raw_read_unsigned (regcache, I387_FSTAT_REGNUM (tdep), &fstat); fstat |= (7 << 11); - regcache_raw_write_unsigned (regcache, I387_FSTAT_REGNUM, fstat); + regcache_raw_write_unsigned (regcache, I387_FSTAT_REGNUM (tdep), fstat); /* Mark %st(1) through %st(7) as empty. Since we set the top of the floating-point register stack to 7, the appropriate value for the tag word is 0x3fff. */ - regcache_raw_write_unsigned (regcache, I387_FTAG_REGNUM, 0x3fff); + regcache_raw_write_unsigned (regcache, I387_FTAG_REGNUM (tdep), 0x3fff); } else { @@ -1515,8 +1504,6 @@ i386_store_return_value (struct gdbarch internal_error (__FILE__, __LINE__, _("Cannot store return value of %d bytes long."), len); } - -#undef I387_ST0_REGNUM } \f @@ -1784,7 +1771,7 @@ i386_register_type (struct gdbarch *gdba if (regnum == I386_EBP_REGNUM || regnum == I386_ESP_REGNUM) return builtin_type_void_data_ptr; - if (i386_fp_regnum_p (regnum)) + if (i386_fp_regnum_p (gdbarch, regnum)) return builtin_type_i387_ext; if (i386_mmx_regnum_p (gdbarch, regnum)) @@ -1793,15 +1780,9 @@ i386_register_type (struct gdbarch *gdba if (i386_sse_regnum_p (gdbarch, regnum)) return i386_sse_type (gdbarch); -#define I387_ST0_REGNUM I386_ST0_REGNUM -#define I387_NUM_XMM_REGS (gdbarch_tdep (gdbarch)->num_xmm_regs) - - if (regnum == I387_MXCSR_REGNUM) + if (regnum == I387_MXCSR_REGNUM (gdbarch_tdep (gdbarch))) return i386_mxcsr_type; -#undef I387_ST0_REGNUM -#undef I387_NUM_XMM_REGS - return builtin_type_int; } @@ -1816,18 +1797,12 @@ i386_mmx_regnum_to_fp_regnum (struct reg ULONGEST fstat; int tos; - /* Define I387_ST0_REGNUM such that we use the proper definitions - for REGCACHE's architecture. */ -#define I387_ST0_REGNUM tdep->st0_regnum - mmxreg = regnum - tdep->mm0_regnum; - regcache_raw_read_unsigned (regcache, I387_FSTAT_REGNUM, &fstat); + regcache_raw_read_unsigned (regcache, I387_FSTAT_REGNUM (tdep), &fstat); tos = (fstat >> 11) & 0x7; fpreg = (mmxreg + tos) % 8; - return (I387_ST0_REGNUM + fpreg); - -#undef I387_ST0_REGNUM + return (I387_ST0_REGNUM (tdep) + fpreg); } static void @@ -1934,12 +1909,13 @@ static void i386_register_to_value (struct frame_info *frame, int regnum, struct type *type, gdb_byte *to) { + struct gdbarch *gdbarch = get_frame_arch (frame); int len = TYPE_LENGTH (type); /* FIXME: kettenis/20030609: What should we do if REGNUM isn't available in FRAME (i.e. if it wasn't saved)? */ - if (i386_fp_regnum_p (regnum)) + if (i386_fp_regnum_p (gdbarch, regnum)) { i387_register_to_value (frame, regnum, type, to); return; @@ -1952,7 +1928,7 @@ i386_register_to_value (struct frame_inf while (len > 0) { gdb_assert (regnum != -1); - gdb_assert (register_size (get_frame_arch (frame), regnum) == 4); + gdb_assert (register_size (gdbarch, regnum) == 4); get_frame_register (frame, regnum, to); regnum = i386_next_regnum (regnum); @@ -1970,7 +1946,7 @@ i386_value_to_register (struct frame_inf { int len = TYPE_LENGTH (type); - if (i386_fp_regnum_p (regnum)) + if (i386_fp_regnum_p (get_frame_arch (frame), regnum)) { i387_value_to_register (frame, regnum, type, from); return; @@ -2284,8 +2260,8 @@ i386_register_reggroup_p (struct gdbarch { int sse_regnum_p = (i386_sse_regnum_p (gdbarch, regnum) || i386_mxcsr_regnum_p (gdbarch, regnum)); - int fp_regnum_p = (i386_fp_regnum_p (regnum) - || i386_fpc_regnum_p (regnum)); + int fp_regnum_p = (i386_fp_regnum_p (gdbarch, regnum) + || i386_fpc_regnum_p (gdbarch, regnum)); int mmx_regnum_p = (i386_mmx_regnum_p (gdbarch, regnum)); if (group == i386_mmx_reggroup) diff -urpN src/gdb/i386-tdep.h dev/gdb/i386-tdep.h --- src/gdb/i386-tdep.h 2008-01-01 23:53:11.000000000 +0100 +++ dev/gdb/i386-tdep.h 2008-02-20 17:24:13.000000000 +0100 @@ -116,8 +116,8 @@ struct gdbarch_tdep /* Return non-zero if REGNUM matches the FP register and the FP register set is active. */ -extern int i386_fp_regnum_p (int regnum); -extern int i386_fpc_regnum_p (int regnum); +extern int i386_fp_regnum_p (struct gdbarch *, int); +extern int i386_fpc_regnum_p (struct gdbarch *, int); /* Register numbers of various important registers. */ diff -urpN src/gdb/i387-tdep.c dev/gdb/i387-tdep.c --- src/gdb/i387-tdep.c 2008-01-01 23:53:11.000000000 +0100 +++ dev/gdb/i387-tdep.c 2008-02-20 17:24:13.000000000 +0100 @@ -215,18 +215,14 @@ i387_print_float_info (struct gdbarch *g gdb_assert (gdbarch == get_frame_arch (frame)); - /* Define I387_ST0_REGNUM such that we use the proper definitions - for FRAME's architecture. */ -#define I387_ST0_REGNUM tdep->st0_regnum - - fctrl = get_frame_register_unsigned (frame, I387_FCTRL_REGNUM); - fstat = get_frame_register_unsigned (frame, I387_FSTAT_REGNUM); - ftag = get_frame_register_unsigned (frame, I387_FTAG_REGNUM); - fiseg = get_frame_register_unsigned (frame, I387_FISEG_REGNUM); - fioff = get_frame_register_unsigned (frame, I387_FIOFF_REGNUM); - foseg = get_frame_register_unsigned (frame, I387_FOSEG_REGNUM); - fooff = get_frame_register_unsigned (frame, I387_FOOFF_REGNUM); - fop = get_frame_register_unsigned (frame, I387_FOP_REGNUM); + fctrl = get_frame_register_unsigned (frame, I387_FCTRL_REGNUM (tdep)); + fstat = get_frame_register_unsigned (frame, I387_FSTAT_REGNUM (tdep)); + ftag = get_frame_register_unsigned (frame, I387_FTAG_REGNUM (tdep)); + fiseg = get_frame_register_unsigned (frame, I387_FISEG_REGNUM (tdep)); + fioff = get_frame_register_unsigned (frame, I387_FIOFF_REGNUM (tdep)); + foseg = get_frame_register_unsigned (frame, I387_FOSEG_REGNUM (tdep)); + fooff = get_frame_register_unsigned (frame, I387_FOOFF_REGNUM (tdep)); + fop = get_frame_register_unsigned (frame, I387_FOP_REGNUM (tdep)); top = ((fstat >> 11) & 7); @@ -254,7 +250,8 @@ i387_print_float_info (struct gdbarch *g break; } - get_frame_register (frame, (fpreg + 8 - top) % 8 + I387_ST0_REGNUM, raw); + get_frame_register (frame, (fpreg + 8 - top) % 8 + I387_ST0_REGNUM (tdep), + raw); fputs_filtered ("0x", file); for (i = 9; i >= 0; i--) @@ -280,8 +277,6 @@ i387_print_float_info (struct gdbarch *g fprintf_filtered (file, "%s\n", hex_string_custom (fooff, 8)); fprintf_filtered (file, "Opcode: %s\n", hex_string_custom (fop ? (fop | 0xd800) : 0, 4)); - -#undef I387_ST0_REGNUM } \f @@ -291,7 +286,7 @@ i387_print_float_info (struct gdbarch *g int i387_convert_register_p (struct gdbarch *gdbarch, int regnum, struct type *type) { - if (i386_fp_regnum_p (regnum)) + if (i386_fp_regnum_p (gdbarch, regnum)) { /* Floating point registers must be converted unless we are accessing them in their hardware type. */ @@ -313,7 +308,7 @@ i387_register_to_value (struct frame_inf { gdb_byte from[I386_MAX_REGISTER_SIZE]; - gdb_assert (i386_fp_regnum_p (regnum)); + gdb_assert (i386_fp_regnum_p (get_frame_arch (frame), regnum)); /* We only support floating-point values. */ if (TYPE_CODE (type) != TYPE_CODE_FLT) @@ -337,7 +332,7 @@ i387_value_to_register (struct frame_inf { gdb_byte to[I386_MAX_REGISTER_SIZE]; - gdb_assert (i386_fp_regnum_p (regnum)); + gdb_assert (i386_fp_regnum_p (get_frame_arch (frame), regnum)); /* We only support floating-point values. */ if (TYPE_CODE (type) != TYPE_CODE_FLT) @@ -379,8 +374,8 @@ static int fsave_offset[] = 18 /* `fop' (bottom 11 bits). */ }; -#define FSAVE_ADDR(fsave, regnum) \ - (fsave + fsave_offset[regnum - I387_ST0_REGNUM]) +#define FSAVE_ADDR(tdep, fsave, regnum) \ + (fsave + fsave_offset[regnum - I387_ST0_REGNUM (tdep)]) \f /* Fill register REGNUM in REGCACHE with the appropriate value from @@ -396,13 +391,7 @@ i387_supply_fsave (struct regcache *regc gdb_assert (tdep->st0_regnum >= I386_ST0_REGNUM); - /* Define I387_ST0_REGNUM and I387_NUM_XMM_REGS such that we use the - proper definitions for REGCACHE's architecture. */ - -#define I387_ST0_REGNUM tdep->st0_regnum -#define I387_NUM_XMM_REGS tdep->num_xmm_regs - - for (i = I387_ST0_REGNUM; i < I387_XMM0_REGNUM; i++) + for (i = I387_ST0_REGNUM (tdep); i < I387_XMM0_REGNUM (tdep); i++) if (regnum == -1 || regnum == i) { if (fsave == NULL) @@ -413,35 +402,32 @@ i387_supply_fsave (struct regcache *regc /* Most of the FPU control registers occupy only 16 bits in the fsave area. Give those a special treatment. */ - if (i >= I387_FCTRL_REGNUM - && i != I387_FIOFF_REGNUM && i != I387_FOOFF_REGNUM) + if (i >= I387_FCTRL_REGNUM (tdep) + && i != I387_FIOFF_REGNUM (tdep) && i != I387_FOOFF_REGNUM (tdep)) { gdb_byte val[4]; - memcpy (val, FSAVE_ADDR (regs, i), 2); + memcpy (val, FSAVE_ADDR (tdep, regs, i), 2); val[2] = val[3] = 0; - if (i == I387_FOP_REGNUM) + if (i == I387_FOP_REGNUM (tdep)) val[1] &= ((1 << 3) - 1); regcache_raw_supply (regcache, i, val); } else - regcache_raw_supply (regcache, i, FSAVE_ADDR (regs, i)); + regcache_raw_supply (regcache, i, FSAVE_ADDR (tdep, regs, i)); } /* Provide dummy values for the SSE registers. */ - for (i = I387_XMM0_REGNUM; i < I387_MXCSR_REGNUM; i++) + for (i = I387_XMM0_REGNUM (tdep); i < I387_MXCSR_REGNUM (tdep); i++) if (regnum == -1 || regnum == i) regcache_raw_supply (regcache, i, NULL); - if (regnum == -1 || regnum == I387_MXCSR_REGNUM) + if (regnum == -1 || regnum == I387_MXCSR_REGNUM (tdep)) { gdb_byte buf[4]; store_unsigned_integer (buf, 4, 0x1f80); - regcache_raw_supply (regcache, I387_MXCSR_REGNUM, buf); + regcache_raw_supply (regcache, I387_MXCSR_REGNUM (tdep), buf); } - -#undef I387_ST0_REGNUM -#undef I387_NUM_XMM_REGS } /* Fill register REGNUM (if it is a floating-point register) in *FSAVE @@ -458,35 +444,30 @@ i387_collect_fsave (const struct regcach gdb_assert (tdep->st0_regnum >= I386_ST0_REGNUM); - /* Define I387_ST0_REGNUM such that we use the proper definitions - for REGCACHE's architecture. */ -#define I387_ST0_REGNUM tdep->st0_regnum - - for (i = I387_ST0_REGNUM; i < I387_XMM0_REGNUM; i++) + for (i = I387_ST0_REGNUM (tdep); i < I387_XMM0_REGNUM (tdep); i++) if (regnum == -1 || regnum == i) { /* Most of the FPU control registers occupy only 16 bits in the fsave area. Give those a special treatment. */ - if (i >= I387_FCTRL_REGNUM - && i != I387_FIOFF_REGNUM && i != I387_FOOFF_REGNUM) + if (i >= I387_FCTRL_REGNUM (tdep) + && i != I387_FIOFF_REGNUM (tdep) && i != I387_FOOFF_REGNUM (tdep)) { gdb_byte buf[4]; regcache_raw_collect (regcache, i, buf); - if (i == I387_FOP_REGNUM) + if (i == I387_FOP_REGNUM (tdep)) { /* The opcode occupies only 11 bits. Make sure we don't touch the other bits. */ buf[1] &= ((1 << 3) - 1); - buf[1] |= ((FSAVE_ADDR (regs, i))[1] & ~((1 << 3) - 1)); + buf[1] |= ((FSAVE_ADDR (tdep, regs, i))[1] & ~((1 << 3) - 1)); } - memcpy (FSAVE_ADDR (regs, i), buf, 2); + memcpy (FSAVE_ADDR (tdep, regs, i), buf, 2); } else - regcache_raw_collect (regcache, i, FSAVE_ADDR (regs, i)); + regcache_raw_collect (regcache, i, FSAVE_ADDR (tdep, regs, i)); } -#undef I387_ST0_REGNUM } \f @@ -530,8 +511,8 @@ static int fxsave_offset[] = 160 + 15 * 16, /* ... %xmm15 (128 bits each). */ }; -#define FXSAVE_ADDR(fxsave, regnum) \ - (fxsave + fxsave_offset[regnum - I387_ST0_REGNUM]) +#define FXSAVE_ADDR(tdep, fxsave, regnum) \ + (fxsave + fxsave_offset[regnum - I387_ST0_REGNUM (tdep)]) /* We made an unfortunate choice in putting %mxcsr after the SSE registers %xmm0-%xmm7 instead of before, since it makes supporting @@ -557,13 +538,7 @@ i387_supply_fxsave (struct regcache *reg gdb_assert (tdep->st0_regnum >= I386_ST0_REGNUM); gdb_assert (tdep->num_xmm_regs > 0); - /* Define I387_ST0_REGNUM and I387_NUM_XMM_REGS such that we use the - proper definitions for REGCACHE's architecture. */ - -#define I387_ST0_REGNUM tdep->st0_regnum -#define I387_NUM_XMM_REGS tdep->num_xmm_regs - - for (i = I387_ST0_REGNUM; i < I387_MXCSR_REGNUM; i++) + for (i = I387_ST0_REGNUM (tdep); i < I387_MXCSR_REGNUM (tdep); i++) if (regnum == -1 || regnum == i) { if (regs == NULL) @@ -574,16 +549,16 @@ i387_supply_fxsave (struct regcache *reg /* Most of the FPU control registers occupy only 16 bits in the fxsave area. Give those a special treatment. */ - if (i >= I387_FCTRL_REGNUM && i < I387_XMM0_REGNUM - && i != I387_FIOFF_REGNUM && i != I387_FOOFF_REGNUM) + if (i >= I387_FCTRL_REGNUM (tdep) && i < I387_XMM0_REGNUM (tdep) + && i != I387_FIOFF_REGNUM (tdep) && i != I387_FOOFF_REGNUM (tdep)) { gdb_byte val[4]; - memcpy (val, FXSAVE_ADDR (regs, i), 2); + memcpy (val, FXSAVE_ADDR (tdep, regs, i), 2); val[2] = val[3] = 0; - if (i == I387_FOP_REGNUM) + if (i == I387_FOP_REGNUM (tdep)) val[1] &= ((1 << 3) - 1); - else if (i== I387_FTAG_REGNUM) + else if (i== I387_FTAG_REGNUM (tdep)) { /* The fxsave area contains a simplified version of the tag word. We have to look at the actual 80-bit @@ -593,7 +568,8 @@ i387_supply_fxsave (struct regcache *reg int fpreg; int top; - top = ((FXSAVE_ADDR (regs, I387_FSTAT_REGNUM))[1] >> 3); + top = ((FXSAVE_ADDR (tdep, regs, + I387_FSTAT_REGNUM (tdep)))[1] >> 3); top &= 0x7; for (fpreg = 7; fpreg >= 0; fpreg--) @@ -602,8 +578,9 @@ i387_supply_fxsave (struct regcache *reg if (val[0] & (1 << fpreg)) { - int regnum = (fpreg + 8 - top) % 8 + I387_ST0_REGNUM; - tag = i387_tag (FXSAVE_ADDR (regs, regnum)); + int regnum = (fpreg + 8 - top) % 8 + + I387_ST0_REGNUM (tdep); + tag = i387_tag (FXSAVE_ADDR (tdep, regs, regnum)); } else tag = 3; /* Empty */ @@ -616,20 +593,17 @@ i387_supply_fxsave (struct regcache *reg regcache_raw_supply (regcache, i, val); } else - regcache_raw_supply (regcache, i, FXSAVE_ADDR (regs, i)); + regcache_raw_supply (regcache, i, FXSAVE_ADDR (tdep, regs, i)); } - if (regnum == I387_MXCSR_REGNUM || regnum == -1) + if (regnum == I387_MXCSR_REGNUM (tdep) || regnum == -1) { if (regs == NULL) - regcache_raw_supply (regcache, I387_MXCSR_REGNUM, NULL); + regcache_raw_supply (regcache, I387_MXCSR_REGNUM (tdep), NULL); else - regcache_raw_supply (regcache, I387_MXCSR_REGNUM, + regcache_raw_supply (regcache, I387_MXCSR_REGNUM (tdep), FXSAVE_MXCSR_ADDR (regs)); } - -#undef I387_ST0_REGNUM -#undef I387_NUM_XMM_REGS } /* Fill register REGNUM (if it is a floating-point or SSE register) in @@ -647,32 +621,26 @@ i387_collect_fxsave (const struct regcac gdb_assert (tdep->st0_regnum >= I386_ST0_REGNUM); gdb_assert (tdep->num_xmm_regs > 0); - /* Define I387_ST0_REGNUM and I387_NUM_XMM_REGS such that we use the - proper definitions for REGCACHE's architecture. */ - -#define I387_ST0_REGNUM tdep->st0_regnum -#define I387_NUM_XMM_REGS tdep->num_xmm_regs - - for (i = I387_ST0_REGNUM; i < I387_MXCSR_REGNUM; i++) + for (i = I387_ST0_REGNUM (tdep); i < I387_MXCSR_REGNUM (tdep); i++) if (regnum == -1 || regnum == i) { /* Most of the FPU control registers occupy only 16 bits in the fxsave area. Give those a special treatment. */ - if (i >= I387_FCTRL_REGNUM && i < I387_XMM0_REGNUM - && i != I387_FIOFF_REGNUM && i != I387_FOOFF_REGNUM) + if (i >= I387_FCTRL_REGNUM (tdep) && i < I387_XMM0_REGNUM (tdep) + && i != I387_FIOFF_REGNUM (tdep) && i != I387_FOOFF_REGNUM (tdep)) { gdb_byte buf[4]; regcache_raw_collect (regcache, i, buf); - if (i == I387_FOP_REGNUM) + if (i == I387_FOP_REGNUM (tdep)) { /* The opcode occupies only 11 bits. Make sure we don't touch the other bits. */ buf[1] &= ((1 << 3) - 1); - buf[1] |= ((FXSAVE_ADDR (regs, i))[1] & ~((1 << 3) - 1)); + buf[1] |= ((FXSAVE_ADDR (tdep, regs, i))[1] & ~((1 << 3) - 1)); } - else if (i == I387_FTAG_REGNUM) + else if (i == I387_FTAG_REGNUM (tdep)) { /* Converting back is much easier. */ @@ -691,18 +659,15 @@ i387_collect_fxsave (const struct regcac buf[0] |= (1 << fpreg); } } - memcpy (FXSAVE_ADDR (regs, i), buf, 2); + memcpy (FXSAVE_ADDR (tdep, regs, i), buf, 2); } else - regcache_raw_collect (regcache, i, FXSAVE_ADDR (regs, i)); + regcache_raw_collect (regcache, i, FXSAVE_ADDR (tdep, regs, i)); } - if (regnum == I387_MXCSR_REGNUM || regnum == -1) - regcache_raw_collect (regcache, I387_MXCSR_REGNUM, + if (regnum == I387_MXCSR_REGNUM (tdep) || regnum == -1) + regcache_raw_collect (regcache, I387_MXCSR_REGNUM (tdep), FXSAVE_MXCSR_ADDR (regs)); - -#undef I387_ST0_REGNUM -#undef I387_NUM_XMM_REGS } /* Recreate the FTW (tag word) valid bits from the 80-bit FP data in @@ -762,22 +727,17 @@ i387_return_value (struct gdbarch *gdbar struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); ULONGEST fstat; - /* Define I387_ST0_REGNUM such that we use the proper - definitions for the architecture. */ -#define I387_ST0_REGNUM tdep->st0_regnum - /* Set the top of the floating-point register stack to 7. The actual value doesn't really matter, but 7 is what a normal function return would end up with if the program started out with a freshly initialized FPU. */ - regcache_raw_read_unsigned (regcache, I387_FSTAT_REGNUM, &fstat); + regcache_raw_read_unsigned (regcache, I387_FSTAT_REGNUM (tdep), &fstat); fstat |= (7 << 11); - regcache_raw_write_unsigned (regcache, I387_FSTAT_REGNUM, fstat); + regcache_raw_write_unsigned (regcache, I387_FSTAT_REGNUM (tdep), fstat); /* Mark %st(1) through %st(7) as empty. Since we set the top of the floating-point register stack to 7, the appropriate value for the tag word is 0x3fff. */ - regcache_raw_write_unsigned (regcache, I387_FTAG_REGNUM, 0x3fff); + regcache_raw_write_unsigned (regcache, I387_FTAG_REGNUM (tdep), 0x3fff); -#undef I387_ST0_REGNUM } diff -urpN src/gdb/i387-tdep.h dev/gdb/i387-tdep.h --- src/gdb/i387-tdep.h 2008-01-01 23:53:11.000000000 +0100 +++ dev/gdb/i387-tdep.h 2008-02-20 17:25:35.000000000 +0100 @@ -27,25 +27,21 @@ struct regcache; struct type; struct ui_file; -/* Because the number of general-purpose registers is different for - AMD64, the floating-point registers and SSE registers get shifted. - The following definitions are intended to help writing code that - needs the register numbers of floating-point registers and SSE - registers. In order to use these, one should provide a definition - for I387_ST0_REGNUM, and possibly I387_NUM_XMM_REGS, preferably by - using a local "#define" in the body of the function that uses this. - Please "#undef" them before the end of the function. */ - -#define I387_FCTRL_REGNUM (I387_ST0_REGNUM + 8) -#define I387_FSTAT_REGNUM (I387_FCTRL_REGNUM + 1) -#define I387_FTAG_REGNUM (I387_FCTRL_REGNUM + 2) -#define I387_FISEG_REGNUM (I387_FCTRL_REGNUM + 3) -#define I387_FIOFF_REGNUM (I387_FCTRL_REGNUM + 4) -#define I387_FOSEG_REGNUM (I387_FCTRL_REGNUM + 5) -#define I387_FOOFF_REGNUM (I387_FCTRL_REGNUM + 6) -#define I387_FOP_REGNUM (I387_FCTRL_REGNUM + 7) -#define I387_XMM0_REGNUM (I387_ST0_REGNUM + 16) -#define I387_MXCSR_REGNUM (I387_XMM0_REGNUM + I387_NUM_XMM_REGS) +#define I387_ST0_REGNUM(tdep) (tdep->st0_regnum) +#define I387_NUM_XMM_REGS(tdep) (tdep->num_xmm_regs) +#define I387_MM0_REGNUM(tdep) (tdep->mm0_regnum) + +#define I387_FCTRL_REGNUM(tdep) (I387_ST0_REGNUM(tdep) + 8) +#define I387_FSTAT_REGNUM(tdep) (I387_FCTRL_REGNUM(tdep)+ 1) +#define I387_FTAG_REGNUM(tdep) (I387_FCTRL_REGNUM(tdep)+ 2) +#define I387_FISEG_REGNUM(tdep) (I387_FCTRL_REGNUM(tdep)+ 3) +#define I387_FIOFF_REGNUM(tdep) (I387_FCTRL_REGNUM(tdep)+ 4) +#define I387_FOSEG_REGNUM(tdep) (I387_FCTRL_REGNUM(tdep)+ 5) +#define I387_FOOFF_REGNUM(tdep) (I387_FCTRL_REGNUM(tdep)+ 6) +#define I387_FOP_REGNUM(tdep) (I387_FCTRL_REGNUM(tdep)+ 7) +#define I387_XMM0_REGNUM(tdep) (I387_ST0_REGNUM(tdep)+ 16) +#define I387_MXCSR_REGNUM(tdep) (I387_XMM0_REGNUM(tdep) \ ++ I387_NUM_XMM_REGS(tdep)) \f /* Print out the i387 floating point state. */ ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [rfc] Replace x86 register macros 2008-02-20 16:45 ` Markus Deuling @ 2008-03-04 0:32 ` Ulrich Weigand 2008-03-10 6:58 ` Markus Deuling 0 siblings, 1 reply; 9+ messages in thread From: Ulrich Weigand @ 2008-03-04 0:32 UTC (permalink / raw) To: Markus Deuling; +Cc: GDB Patches, Daniel Jacobowitz Markus Deuling wrote: > thanks both for your input. I reworked the patch now. Tested on x86 without regressions > Maybe someone can run a test on amd64 as I don't have such a machine? I've tested this on amd64-linux with no regressions. > +#define I387_ST0_REGNUM(tdep) (tdep->st0_regnum) > +#define I387_NUM_XMM_REGS(tdep) (tdep->num_xmm_regs) > +#define I387_MM0_REGNUM(tdep) (tdep->mm0_regnum) You need to put parentheses around "tdep" to protect against macro evaluation issues ... > +#define I387_FCTRL_REGNUM(tdep) (I387_ST0_REGNUM(tdep) + 8) > +#define I387_FSTAT_REGNUM(tdep) (I387_FCTRL_REGNUM(tdep)+ 1) > +#define I387_FTAG_REGNUM(tdep) (I387_FCTRL_REGNUM(tdep)+ 2) > +#define I387_FISEG_REGNUM(tdep) (I387_FCTRL_REGNUM(tdep)+ 3) > +#define I387_FIOFF_REGNUM(tdep) (I387_FCTRL_REGNUM(tdep)+ 4) > +#define I387_FOSEG_REGNUM(tdep) (I387_FCTRL_REGNUM(tdep)+ 5) > +#define I387_FOOFF_REGNUM(tdep) (I387_FCTRL_REGNUM(tdep)+ 6) > +#define I387_FOP_REGNUM(tdep) (I387_FCTRL_REGNUM(tdep)+ 7) > +#define I387_XMM0_REGNUM(tdep) (I387_ST0_REGNUM(tdep)+ 16) > +#define I387_MXCSR_REGNUM(tdep) (I387_XMM0_REGNUM(tdep) \ > ++ I387_NUM_XMM_REGS(tdep)) Formatting (whitespace and indentation) is a bit odd here. Also, you've forgotten to adapt a couple of uses of the I387_ macros in win32-nat.c. Otherwise, this looks fine to me. Thanks, Ulrich -- Dr. Ulrich Weigand GNU Toolchain for Linux on System z and Cell BE Ulrich.Weigand@de.ibm.com ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [rfc] Replace x86 register macros 2008-03-04 0:32 ` Ulrich Weigand @ 2008-03-10 6:58 ` Markus Deuling 2008-03-10 12:13 ` Ulrich Weigand 0 siblings, 1 reply; 9+ messages in thread From: Markus Deuling @ 2008-03-10 6:58 UTC (permalink / raw) To: Ulrich Weigand; +Cc: GDB Patches, Daniel Jacobowitz [-- Attachment #1: Type: text/plain, Size: 2461 bytes --] Ulrich Weigand schrieb: > Markus Deuling wrote: > Also, you've forgotten to adapt a couple of uses of the I387_ > macros in win32-nat.c. > > Otherwise, this looks fine to me. > Thanks for review, I reworked the patch now. Ok to commit? ChangeLog: * win32-nat.c (do_win32_fetch_inferior_registers): Use get_regcache_arch to get at the current architecture and at the target specific vector. Add target specific vector to I387_FISEG_REGNUM and I387_FOP_REGNUM and remove define of I387_ST0_REGNUM. * amd64-tdep.c (I387_ST0_REGNUM): Remove define. (amd64_supply_fxsave, amd64_collect_fxsave): Use get_regcache_arch to get at the current architecture (I387_FISEG_REGNUM, I387_FOSEG_REGNUM): Add target specific vector as parameter. * i386-tdep.c: Remove various define's and undef's of I387_ST0_REGNUM, I387_NUM_XMM_REGS and I387_MM0_REGNUM. (I387_NUM_XMM_REGS, I387_XMM0_REGNUM, I387_MXCSR_REGNUM, I387_ST0_REGNUM, I387_FCTRL_REGNUM, I387_MM0_REGNUM, (I387_FSTAT_REGNUM): Add target specific vector as parameter. (i386_register_name, i386_dbx_reg_to_regnum): Use gdbarch_tdep to get at the target specific vector. (i386_get_longjmp_target): Use get_frame_arch to get at the current architecture. Use gdbarch_tdep to get at the target specific vector. (i386_fp_regnum_p, i386_fpc_regnum_p): Add gdbarch as parameter and update caller. Use gdbarch_tdep to get at the target specific vector. (i386_register_to_value: Use get_frame_arch to get at the current architecture. * i386-tdep.h (i386_fp_regnum_p, i386_fpc_regnum_p): Add gdbarch as parameter. * i387-tdep.c (I387_FCTRL_REGNUM, I387_FSTAT_REGNUM, I387_FTAG_REGNUM, I387_FISEG_REGNUM, I387_FIOFF_REGNUM, I387_FOSEG_REGNUM I387_FOOFF_REGNUM, I387_FOP_REGNUM, I387_ST0_REGNUM, FSAVE_ADDR, FXSAVE_ADDR, I387_XMM0_REGNUM): Add target specific vector as parameter. (I387_ST0_REGNUM, I387_NUM_XMM_REGS): Remove various define's and undef's. (i387_convert_register_p, i387_register_to_value, i387_value_to_register): Update call for i386_fp_regnum_p. * i387-tdep.h: Remove comment. (I387_ST0_REGNUM, I387_NUM_XMM_REGS, I387_MM0_REGNUM): Add define. (I387_FCTRL_REGNUM, I387_FSTAT_REGNUM, I387_FTAG_REGNUM, I387_FISEG_REGNUM, I387_FIOFF_REGNUM, I387_FOSEG_REGNUM, I387_FOOFF_REGNUM, I387_FOP_REGNUM, I387_XMM0_REGNUM, I387_MXCSR_REGNUM): Add target specific vector as parameter. -- Markus Deuling GNU Toolchain for Linux on Cell BE deuling@de.ibm.com [-- Attachment #2: diff-x86-macros --] [-- Type: text/plain, Size: 30908 bytes --] diff -urpN src/gdb/amd64-tdep.c dev/gdb/amd64-tdep.c --- src/gdb/amd64-tdep.c 2008-02-27 05:52:16.000000000 +0100 +++ dev/gdb/amd64-tdep.c 2008-03-10 07:24:14.000000000 +0100 @@ -1177,8 +1177,6 @@ amd64_init_abi (struct gdbarch_info info } \f -#define I387_ST0_REGNUM AMD64_ST0_REGNUM - /* The 64-bit FXSAVE format differs from the 32-bit format in the sense that the instruction pointer and data pointer are simply 64-bit offsets into the code segment and the data segment instead @@ -1193,18 +1191,21 @@ amd64_init_abi (struct gdbarch_info info void amd64_supply_fxsave (struct regcache *regcache, int regnum, - const void *fxsave) + const void *fxsave) { + struct gdbarch *gdbarch = get_regcache_arch (regcache); + struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); + i387_supply_fxsave (regcache, regnum, fxsave); - if (fxsave && gdbarch_ptr_bit (get_regcache_arch (regcache)) == 64) + if (fxsave && gdbarch_ptr_bit (gdbarch) == 64) { const gdb_byte *regs = fxsave; - if (regnum == -1 || regnum == I387_FISEG_REGNUM) - regcache_raw_supply (regcache, I387_FISEG_REGNUM, regs + 12); - if (regnum == -1 || regnum == I387_FOSEG_REGNUM) - regcache_raw_supply (regcache, I387_FOSEG_REGNUM, regs + 20); + if (regnum == -1 || regnum == I387_FISEG_REGNUM (tdep)) + regcache_raw_supply (regcache, I387_FISEG_REGNUM (tdep), regs + 12); + if (regnum == -1 || regnum == I387_FOSEG_REGNUM (tdep)) + regcache_raw_supply (regcache, I387_FOSEG_REGNUM (tdep), regs + 20); } } @@ -1217,15 +1218,17 @@ void amd64_collect_fxsave (const struct regcache *regcache, int regnum, void *fxsave) { + struct gdbarch *gdbarch = get_regcache_arch (regcache); + struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); gdb_byte *regs = fxsave; i387_collect_fxsave (regcache, regnum, fxsave); - if (gdbarch_ptr_bit (get_regcache_arch (regcache)) == 64) + if (gdbarch_ptr_bit (gdbarch) == 64) { - if (regnum == -1 || regnum == I387_FISEG_REGNUM) - regcache_raw_collect (regcache, I387_FISEG_REGNUM, regs + 12); - if (regnum == -1 || regnum == I387_FOSEG_REGNUM) - regcache_raw_collect (regcache, I387_FOSEG_REGNUM, regs + 20); + if (regnum == -1 || regnum == I387_FISEG_REGNUM (tdep)) + regcache_raw_collect (regcache, I387_FISEG_REGNUM (tdep), regs + 12); + if (regnum == -1 || regnum == I387_FOSEG_REGNUM (tdep)) + regcache_raw_collect (regcache, I387_FOSEG_REGNUM (tdep), regs + 20); } } diff -urpN src/gdb/i386-tdep.c dev/gdb/i386-tdep.c --- src/gdb/i386-tdep.c 2008-02-27 05:52:16.000000000 +0100 +++ dev/gdb/i386-tdep.c 2008-03-10 07:24:14.000000000 +0100 @@ -96,16 +96,11 @@ i386_sse_regnum_p (struct gdbarch *gdbar { struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); -#define I387_ST0_REGNUM tdep->st0_regnum -#define I387_NUM_XMM_REGS tdep->num_xmm_regs - - if (I387_NUM_XMM_REGS == 0) + if (I387_NUM_XMM_REGS (tdep) == 0) return 0; - return (I387_XMM0_REGNUM <= regnum && regnum < I387_MXCSR_REGNUM); - -#undef I387_ST0_REGNUM -#undef I387_NUM_XMM_REGS + return (I387_XMM0_REGNUM (tdep) <= regnum + && regnum < I387_MXCSR_REGNUM (tdep)); } static int @@ -113,40 +108,36 @@ i386_mxcsr_regnum_p (struct gdbarch *gdb { struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); -#define I387_ST0_REGNUM tdep->st0_regnum -#define I387_NUM_XMM_REGS tdep->num_xmm_regs - - if (I387_NUM_XMM_REGS == 0) + if (I387_NUM_XMM_REGS (tdep) == 0) return 0; - return (regnum == I387_MXCSR_REGNUM); - -#undef I387_ST0_REGNUM -#undef I387_NUM_XMM_REGS + return (regnum == I387_MXCSR_REGNUM (tdep)); } -#define I387_ST0_REGNUM (gdbarch_tdep (current_gdbarch)->st0_regnum) -#define I387_MM0_REGNUM (gdbarch_tdep (current_gdbarch)->mm0_regnum) -#define I387_NUM_XMM_REGS (gdbarch_tdep (current_gdbarch)->num_xmm_regs) - /* FP register? */ int -i386_fp_regnum_p (int regnum) +i386_fp_regnum_p (struct gdbarch *gdbarch, int regnum) { - if (I387_ST0_REGNUM < 0) + struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); + + if (I387_ST0_REGNUM (tdep) < 0) return 0; - return (I387_ST0_REGNUM <= regnum && regnum < I387_FCTRL_REGNUM); + return (I387_ST0_REGNUM (tdep) <= regnum + && regnum < I387_FCTRL_REGNUM (tdep)); } int -i386_fpc_regnum_p (int regnum) +i386_fpc_regnum_p (struct gdbarch *gdbarch, int regnum) { - if (I387_ST0_REGNUM < 0) + struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); + + if (I387_ST0_REGNUM (tdep) < 0) return 0; - return (I387_FCTRL_REGNUM <= regnum && regnum < I387_XMM0_REGNUM); + return (I387_FCTRL_REGNUM (tdep) <= regnum + && regnum < I387_XMM0_REGNUM (tdep)); } /* Return the name of register REGNUM. */ @@ -155,7 +146,7 @@ const char * i386_register_name (struct gdbarch *gdbarch, int regnum) { if (i386_mmx_regnum_p (gdbarch, regnum)) - return i386_mmx_names[regnum - I387_MM0_REGNUM]; + return i386_mmx_names[regnum - I387_MM0_REGNUM (gdbarch_tdep (gdbarch))]; if (regnum >= 0 && regnum < i386_num_register_names) return i386_register_names[regnum]; @@ -169,6 +160,8 @@ i386_register_name (struct gdbarch *gdba static int i386_dbx_reg_to_regnum (struct gdbarch *gdbarch, int reg) { + struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); + /* This implements what GCC calls the "default" register map (dbx_register_map[]). */ @@ -185,17 +178,17 @@ i386_dbx_reg_to_regnum (struct gdbarch * else if (reg >= 12 && reg <= 19) { /* Floating-point registers. */ - return reg - 12 + I387_ST0_REGNUM; + return reg - 12 + I387_ST0_REGNUM (tdep); } else if (reg >= 21 && reg <= 28) { /* SSE registers. */ - return reg - 21 + I387_XMM0_REGNUM; + return reg - 21 + I387_XMM0_REGNUM (tdep); } else if (reg >= 29 && reg <= 36) { /* MMX registers. */ - return reg - 29 + I387_MM0_REGNUM; + return reg - 29 + I387_MM0_REGNUM (tdep); } /* This will hopefully provoke a warning. */ @@ -208,6 +201,8 @@ i386_dbx_reg_to_regnum (struct gdbarch * static int i386_svr4_reg_to_regnum (struct gdbarch *gdbarch, int reg) { + struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); + /* This implements the GCC register map that tries to be compatible with the SVR4 C compiler for DWARF (svr4_dbx_register_map[]). */ @@ -221,7 +216,7 @@ i386_svr4_reg_to_regnum (struct gdbarch else if (reg >= 11 && reg <= 18) { /* Floating-point registers. */ - return reg - 11 + I387_ST0_REGNUM; + return reg - 11 + I387_ST0_REGNUM (tdep); } else if (reg >= 21 && reg <= 36) { @@ -231,9 +226,9 @@ i386_svr4_reg_to_regnum (struct gdbarch switch (reg) { - case 37: return I387_FCTRL_REGNUM; - case 38: return I387_FSTAT_REGNUM; - case 39: return I387_MXCSR_REGNUM; + case 37: return I387_FCTRL_REGNUM (tdep); + case 38: return I387_FSTAT_REGNUM (tdep); + case 39: return I387_MXCSR_REGNUM (tdep); case 40: return I386_ES_REGNUM; case 41: return I386_CS_REGNUM; case 42: return I386_SS_REGNUM; @@ -246,9 +241,6 @@ i386_svr4_reg_to_regnum (struct gdbarch return gdbarch_num_regs (gdbarch) + gdbarch_num_pseudo_regs (gdbarch); } -#undef I387_ST0_REGNUM -#undef I387_MM0_REGNUM -#undef I387_NUM_XMM_REGS \f /* This is the variable that is set with "set disassembly-flavor", and @@ -1312,7 +1304,8 @@ i386_get_longjmp_target (struct frame_in { gdb_byte buf[8]; CORE_ADDR sp, jb_addr; - int jb_pc_offset = gdbarch_tdep (get_frame_arch (frame))->jb_pc_offset; + struct gdbarch *gdbarch = get_frame_arch (frame); + int jb_pc_offset = gdbarch_tdep (gdbarch)->jb_pc_offset; int len = TYPE_LENGTH (builtin_type_void_func_ptr); /* If JB_PC_OFFSET is -1, we have no way to find out where the @@ -1322,7 +1315,7 @@ i386_get_longjmp_target (struct frame_in /* Don't use I386_ESP_REGNUM here, since this function is also used for AMD64. */ - get_frame_register (frame, gdbarch_sp_regnum (get_frame_arch (frame)), buf); + get_frame_register (frame, gdbarch_sp_regnum (gdbarch), buf); sp = extract_typed_address (buf, builtin_type_void_data_ptr); if (target_read_memory (sp + len, buf, len)) return 0; @@ -1459,10 +1452,6 @@ i386_store_return_value (struct gdbarch struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); int len = TYPE_LENGTH (type); - /* Define I387_ST0_REGNUM such that we use the proper definitions - for the architecture. */ -#define I387_ST0_REGNUM I386_ST0_REGNUM - if (TYPE_CODE (type) == TYPE_CODE_FLT) { ULONGEST fstat; @@ -1489,14 +1478,14 @@ i386_store_return_value (struct gdbarch actual value doesn't really matter, but 7 is what a normal function return would end up with if the program started out with a freshly initialized FPU. */ - regcache_raw_read_unsigned (regcache, I387_FSTAT_REGNUM, &fstat); + regcache_raw_read_unsigned (regcache, I387_FSTAT_REGNUM (tdep), &fstat); fstat |= (7 << 11); - regcache_raw_write_unsigned (regcache, I387_FSTAT_REGNUM, fstat); + regcache_raw_write_unsigned (regcache, I387_FSTAT_REGNUM (tdep), fstat); /* Mark %st(1) through %st(7) as empty. Since we set the top of the floating-point register stack to 7, the appropriate value for the tag word is 0x3fff. */ - regcache_raw_write_unsigned (regcache, I387_FTAG_REGNUM, 0x3fff); + regcache_raw_write_unsigned (regcache, I387_FTAG_REGNUM (tdep), 0x3fff); } else { @@ -1515,8 +1504,6 @@ i386_store_return_value (struct gdbarch internal_error (__FILE__, __LINE__, _("Cannot store return value of %d bytes long."), len); } - -#undef I387_ST0_REGNUM } \f @@ -1786,7 +1773,7 @@ i386_register_type (struct gdbarch *gdba if (regnum == I386_EBP_REGNUM || regnum == I386_ESP_REGNUM) return builtin_type_void_data_ptr; - if (i386_fp_regnum_p (regnum)) + if (i386_fp_regnum_p (gdbarch, regnum)) return builtin_type_i387_ext; if (i386_mmx_regnum_p (gdbarch, regnum)) @@ -1795,15 +1782,9 @@ i386_register_type (struct gdbarch *gdba if (i386_sse_regnum_p (gdbarch, regnum)) return i386_sse_type (gdbarch); -#define I387_ST0_REGNUM I386_ST0_REGNUM -#define I387_NUM_XMM_REGS (gdbarch_tdep (gdbarch)->num_xmm_regs) - - if (regnum == I387_MXCSR_REGNUM) + if (regnum == I387_MXCSR_REGNUM (gdbarch_tdep (gdbarch))) return i386_mxcsr_type; -#undef I387_ST0_REGNUM -#undef I387_NUM_XMM_REGS - return builtin_type_int; } @@ -1818,18 +1799,12 @@ i386_mmx_regnum_to_fp_regnum (struct reg ULONGEST fstat; int tos; - /* Define I387_ST0_REGNUM such that we use the proper definitions - for REGCACHE's architecture. */ -#define I387_ST0_REGNUM tdep->st0_regnum - mmxreg = regnum - tdep->mm0_regnum; - regcache_raw_read_unsigned (regcache, I387_FSTAT_REGNUM, &fstat); + regcache_raw_read_unsigned (regcache, I387_FSTAT_REGNUM (tdep), &fstat); tos = (fstat >> 11) & 0x7; fpreg = (mmxreg + tos) % 8; - return (I387_ST0_REGNUM + fpreg); - -#undef I387_ST0_REGNUM + return (I387_ST0_REGNUM (tdep) + fpreg); } static void @@ -1936,12 +1911,13 @@ static void i386_register_to_value (struct frame_info *frame, int regnum, struct type *type, gdb_byte *to) { + struct gdbarch *gdbarch = get_frame_arch (frame); int len = TYPE_LENGTH (type); /* FIXME: kettenis/20030609: What should we do if REGNUM isn't available in FRAME (i.e. if it wasn't saved)? */ - if (i386_fp_regnum_p (regnum)) + if (i386_fp_regnum_p (gdbarch, regnum)) { i387_register_to_value (frame, regnum, type, to); return; @@ -1954,7 +1930,7 @@ i386_register_to_value (struct frame_inf while (len > 0) { gdb_assert (regnum != -1); - gdb_assert (register_size (get_frame_arch (frame), regnum) == 4); + gdb_assert (register_size (gdbarch, regnum) == 4); get_frame_register (frame, regnum, to); regnum = i386_next_regnum (regnum); @@ -1972,7 +1948,7 @@ i386_value_to_register (struct frame_inf { int len = TYPE_LENGTH (type); - if (i386_fp_regnum_p (regnum)) + if (i386_fp_regnum_p (get_frame_arch (frame), regnum)) { i387_value_to_register (frame, regnum, type, from); return; @@ -2286,8 +2262,8 @@ i386_register_reggroup_p (struct gdbarch { int sse_regnum_p = (i386_sse_regnum_p (gdbarch, regnum) || i386_mxcsr_regnum_p (gdbarch, regnum)); - int fp_regnum_p = (i386_fp_regnum_p (regnum) - || i386_fpc_regnum_p (regnum)); + int fp_regnum_p = (i386_fp_regnum_p (gdbarch, regnum) + || i386_fpc_regnum_p (gdbarch, regnum)); int mmx_regnum_p = (i386_mmx_regnum_p (gdbarch, regnum)); if (group == i386_mmx_reggroup) diff -urpN src/gdb/i386-tdep.h dev/gdb/i386-tdep.h --- src/gdb/i386-tdep.h 2008-01-01 23:53:11.000000000 +0100 +++ dev/gdb/i386-tdep.h 2008-03-10 07:24:14.000000000 +0100 @@ -116,8 +116,8 @@ struct gdbarch_tdep /* Return non-zero if REGNUM matches the FP register and the FP register set is active. */ -extern int i386_fp_regnum_p (int regnum); -extern int i386_fpc_regnum_p (int regnum); +extern int i386_fp_regnum_p (struct gdbarch *, int); +extern int i386_fpc_regnum_p (struct gdbarch *, int); /* Register numbers of various important registers. */ diff -urpN src/gdb/i387-tdep.c dev/gdb/i387-tdep.c --- src/gdb/i387-tdep.c 2008-01-01 23:53:11.000000000 +0100 +++ dev/gdb/i387-tdep.c 2008-03-10 07:24:14.000000000 +0100 @@ -215,18 +215,14 @@ i387_print_float_info (struct gdbarch *g gdb_assert (gdbarch == get_frame_arch (frame)); - /* Define I387_ST0_REGNUM such that we use the proper definitions - for FRAME's architecture. */ -#define I387_ST0_REGNUM tdep->st0_regnum - - fctrl = get_frame_register_unsigned (frame, I387_FCTRL_REGNUM); - fstat = get_frame_register_unsigned (frame, I387_FSTAT_REGNUM); - ftag = get_frame_register_unsigned (frame, I387_FTAG_REGNUM); - fiseg = get_frame_register_unsigned (frame, I387_FISEG_REGNUM); - fioff = get_frame_register_unsigned (frame, I387_FIOFF_REGNUM); - foseg = get_frame_register_unsigned (frame, I387_FOSEG_REGNUM); - fooff = get_frame_register_unsigned (frame, I387_FOOFF_REGNUM); - fop = get_frame_register_unsigned (frame, I387_FOP_REGNUM); + fctrl = get_frame_register_unsigned (frame, I387_FCTRL_REGNUM (tdep)); + fstat = get_frame_register_unsigned (frame, I387_FSTAT_REGNUM (tdep)); + ftag = get_frame_register_unsigned (frame, I387_FTAG_REGNUM (tdep)); + fiseg = get_frame_register_unsigned (frame, I387_FISEG_REGNUM (tdep)); + fioff = get_frame_register_unsigned (frame, I387_FIOFF_REGNUM (tdep)); + foseg = get_frame_register_unsigned (frame, I387_FOSEG_REGNUM (tdep)); + fooff = get_frame_register_unsigned (frame, I387_FOOFF_REGNUM (tdep)); + fop = get_frame_register_unsigned (frame, I387_FOP_REGNUM (tdep)); top = ((fstat >> 11) & 7); @@ -254,7 +250,8 @@ i387_print_float_info (struct gdbarch *g break; } - get_frame_register (frame, (fpreg + 8 - top) % 8 + I387_ST0_REGNUM, raw); + get_frame_register (frame, (fpreg + 8 - top) % 8 + I387_ST0_REGNUM (tdep), + raw); fputs_filtered ("0x", file); for (i = 9; i >= 0; i--) @@ -280,8 +277,6 @@ i387_print_float_info (struct gdbarch *g fprintf_filtered (file, "%s\n", hex_string_custom (fooff, 8)); fprintf_filtered (file, "Opcode: %s\n", hex_string_custom (fop ? (fop | 0xd800) : 0, 4)); - -#undef I387_ST0_REGNUM } \f @@ -291,7 +286,7 @@ i387_print_float_info (struct gdbarch *g int i387_convert_register_p (struct gdbarch *gdbarch, int regnum, struct type *type) { - if (i386_fp_regnum_p (regnum)) + if (i386_fp_regnum_p (gdbarch, regnum)) { /* Floating point registers must be converted unless we are accessing them in their hardware type. */ @@ -313,7 +308,7 @@ i387_register_to_value (struct frame_inf { gdb_byte from[I386_MAX_REGISTER_SIZE]; - gdb_assert (i386_fp_regnum_p (regnum)); + gdb_assert (i386_fp_regnum_p (get_frame_arch (frame), regnum)); /* We only support floating-point values. */ if (TYPE_CODE (type) != TYPE_CODE_FLT) @@ -337,7 +332,7 @@ i387_value_to_register (struct frame_inf { gdb_byte to[I386_MAX_REGISTER_SIZE]; - gdb_assert (i386_fp_regnum_p (regnum)); + gdb_assert (i386_fp_regnum_p (get_frame_arch (frame), regnum)); /* We only support floating-point values. */ if (TYPE_CODE (type) != TYPE_CODE_FLT) @@ -379,8 +374,8 @@ static int fsave_offset[] = 18 /* `fop' (bottom 11 bits). */ }; -#define FSAVE_ADDR(fsave, regnum) \ - (fsave + fsave_offset[regnum - I387_ST0_REGNUM]) +#define FSAVE_ADDR(tdep, fsave, regnum) \ + (fsave + fsave_offset[regnum - I387_ST0_REGNUM (tdep)]) \f /* Fill register REGNUM in REGCACHE with the appropriate value from @@ -396,13 +391,7 @@ i387_supply_fsave (struct regcache *regc gdb_assert (tdep->st0_regnum >= I386_ST0_REGNUM); - /* Define I387_ST0_REGNUM and I387_NUM_XMM_REGS such that we use the - proper definitions for REGCACHE's architecture. */ - -#define I387_ST0_REGNUM tdep->st0_regnum -#define I387_NUM_XMM_REGS tdep->num_xmm_regs - - for (i = I387_ST0_REGNUM; i < I387_XMM0_REGNUM; i++) + for (i = I387_ST0_REGNUM (tdep); i < I387_XMM0_REGNUM (tdep); i++) if (regnum == -1 || regnum == i) { if (fsave == NULL) @@ -413,35 +402,32 @@ i387_supply_fsave (struct regcache *regc /* Most of the FPU control registers occupy only 16 bits in the fsave area. Give those a special treatment. */ - if (i >= I387_FCTRL_REGNUM - && i != I387_FIOFF_REGNUM && i != I387_FOOFF_REGNUM) + if (i >= I387_FCTRL_REGNUM (tdep) + && i != I387_FIOFF_REGNUM (tdep) && i != I387_FOOFF_REGNUM (tdep)) { gdb_byte val[4]; - memcpy (val, FSAVE_ADDR (regs, i), 2); + memcpy (val, FSAVE_ADDR (tdep, regs, i), 2); val[2] = val[3] = 0; - if (i == I387_FOP_REGNUM) + if (i == I387_FOP_REGNUM (tdep)) val[1] &= ((1 << 3) - 1); regcache_raw_supply (regcache, i, val); } else - regcache_raw_supply (regcache, i, FSAVE_ADDR (regs, i)); + regcache_raw_supply (regcache, i, FSAVE_ADDR (tdep, regs, i)); } /* Provide dummy values for the SSE registers. */ - for (i = I387_XMM0_REGNUM; i < I387_MXCSR_REGNUM; i++) + for (i = I387_XMM0_REGNUM (tdep); i < I387_MXCSR_REGNUM (tdep); i++) if (regnum == -1 || regnum == i) regcache_raw_supply (regcache, i, NULL); - if (regnum == -1 || regnum == I387_MXCSR_REGNUM) + if (regnum == -1 || regnum == I387_MXCSR_REGNUM (tdep)) { gdb_byte buf[4]; store_unsigned_integer (buf, 4, 0x1f80); - regcache_raw_supply (regcache, I387_MXCSR_REGNUM, buf); + regcache_raw_supply (regcache, I387_MXCSR_REGNUM (tdep), buf); } - -#undef I387_ST0_REGNUM -#undef I387_NUM_XMM_REGS } /* Fill register REGNUM (if it is a floating-point register) in *FSAVE @@ -458,35 +444,30 @@ i387_collect_fsave (const struct regcach gdb_assert (tdep->st0_regnum >= I386_ST0_REGNUM); - /* Define I387_ST0_REGNUM such that we use the proper definitions - for REGCACHE's architecture. */ -#define I387_ST0_REGNUM tdep->st0_regnum - - for (i = I387_ST0_REGNUM; i < I387_XMM0_REGNUM; i++) + for (i = I387_ST0_REGNUM (tdep); i < I387_XMM0_REGNUM (tdep); i++) if (regnum == -1 || regnum == i) { /* Most of the FPU control registers occupy only 16 bits in the fsave area. Give those a special treatment. */ - if (i >= I387_FCTRL_REGNUM - && i != I387_FIOFF_REGNUM && i != I387_FOOFF_REGNUM) + if (i >= I387_FCTRL_REGNUM (tdep) + && i != I387_FIOFF_REGNUM (tdep) && i != I387_FOOFF_REGNUM (tdep)) { gdb_byte buf[4]; regcache_raw_collect (regcache, i, buf); - if (i == I387_FOP_REGNUM) + if (i == I387_FOP_REGNUM (tdep)) { /* The opcode occupies only 11 bits. Make sure we don't touch the other bits. */ buf[1] &= ((1 << 3) - 1); - buf[1] |= ((FSAVE_ADDR (regs, i))[1] & ~((1 << 3) - 1)); + buf[1] |= ((FSAVE_ADDR (tdep, regs, i))[1] & ~((1 << 3) - 1)); } - memcpy (FSAVE_ADDR (regs, i), buf, 2); + memcpy (FSAVE_ADDR (tdep, regs, i), buf, 2); } else - regcache_raw_collect (regcache, i, FSAVE_ADDR (regs, i)); + regcache_raw_collect (regcache, i, FSAVE_ADDR (tdep, regs, i)); } -#undef I387_ST0_REGNUM } \f @@ -530,8 +511,8 @@ static int fxsave_offset[] = 160 + 15 * 16, /* ... %xmm15 (128 bits each). */ }; -#define FXSAVE_ADDR(fxsave, regnum) \ - (fxsave + fxsave_offset[regnum - I387_ST0_REGNUM]) +#define FXSAVE_ADDR(tdep, fxsave, regnum) \ + (fxsave + fxsave_offset[regnum - I387_ST0_REGNUM (tdep)]) /* We made an unfortunate choice in putting %mxcsr after the SSE registers %xmm0-%xmm7 instead of before, since it makes supporting @@ -557,13 +538,7 @@ i387_supply_fxsave (struct regcache *reg gdb_assert (tdep->st0_regnum >= I386_ST0_REGNUM); gdb_assert (tdep->num_xmm_regs > 0); - /* Define I387_ST0_REGNUM and I387_NUM_XMM_REGS such that we use the - proper definitions for REGCACHE's architecture. */ - -#define I387_ST0_REGNUM tdep->st0_regnum -#define I387_NUM_XMM_REGS tdep->num_xmm_regs - - for (i = I387_ST0_REGNUM; i < I387_MXCSR_REGNUM; i++) + for (i = I387_ST0_REGNUM (tdep); i < I387_MXCSR_REGNUM (tdep); i++) if (regnum == -1 || regnum == i) { if (regs == NULL) @@ -574,16 +549,16 @@ i387_supply_fxsave (struct regcache *reg /* Most of the FPU control registers occupy only 16 bits in the fxsave area. Give those a special treatment. */ - if (i >= I387_FCTRL_REGNUM && i < I387_XMM0_REGNUM - && i != I387_FIOFF_REGNUM && i != I387_FOOFF_REGNUM) + if (i >= I387_FCTRL_REGNUM (tdep) && i < I387_XMM0_REGNUM (tdep) + && i != I387_FIOFF_REGNUM (tdep) && i != I387_FOOFF_REGNUM (tdep)) { gdb_byte val[4]; - memcpy (val, FXSAVE_ADDR (regs, i), 2); + memcpy (val, FXSAVE_ADDR (tdep, regs, i), 2); val[2] = val[3] = 0; - if (i == I387_FOP_REGNUM) + if (i == I387_FOP_REGNUM (tdep)) val[1] &= ((1 << 3) - 1); - else if (i== I387_FTAG_REGNUM) + else if (i== I387_FTAG_REGNUM (tdep)) { /* The fxsave area contains a simplified version of the tag word. We have to look at the actual 80-bit @@ -593,7 +568,8 @@ i387_supply_fxsave (struct regcache *reg int fpreg; int top; - top = ((FXSAVE_ADDR (regs, I387_FSTAT_REGNUM))[1] >> 3); + top = ((FXSAVE_ADDR (tdep, regs, + I387_FSTAT_REGNUM (tdep)))[1] >> 3); top &= 0x7; for (fpreg = 7; fpreg >= 0; fpreg--) @@ -602,8 +578,9 @@ i387_supply_fxsave (struct regcache *reg if (val[0] & (1 << fpreg)) { - int regnum = (fpreg + 8 - top) % 8 + I387_ST0_REGNUM; - tag = i387_tag (FXSAVE_ADDR (regs, regnum)); + int regnum = (fpreg + 8 - top) % 8 + + I387_ST0_REGNUM (tdep); + tag = i387_tag (FXSAVE_ADDR (tdep, regs, regnum)); } else tag = 3; /* Empty */ @@ -616,20 +593,17 @@ i387_supply_fxsave (struct regcache *reg regcache_raw_supply (regcache, i, val); } else - regcache_raw_supply (regcache, i, FXSAVE_ADDR (regs, i)); + regcache_raw_supply (regcache, i, FXSAVE_ADDR (tdep, regs, i)); } - if (regnum == I387_MXCSR_REGNUM || regnum == -1) + if (regnum == I387_MXCSR_REGNUM (tdep) || regnum == -1) { if (regs == NULL) - regcache_raw_supply (regcache, I387_MXCSR_REGNUM, NULL); + regcache_raw_supply (regcache, I387_MXCSR_REGNUM (tdep), NULL); else - regcache_raw_supply (regcache, I387_MXCSR_REGNUM, + regcache_raw_supply (regcache, I387_MXCSR_REGNUM (tdep), FXSAVE_MXCSR_ADDR (regs)); } - -#undef I387_ST0_REGNUM -#undef I387_NUM_XMM_REGS } /* Fill register REGNUM (if it is a floating-point or SSE register) in @@ -647,32 +621,26 @@ i387_collect_fxsave (const struct regcac gdb_assert (tdep->st0_regnum >= I386_ST0_REGNUM); gdb_assert (tdep->num_xmm_regs > 0); - /* Define I387_ST0_REGNUM and I387_NUM_XMM_REGS such that we use the - proper definitions for REGCACHE's architecture. */ - -#define I387_ST0_REGNUM tdep->st0_regnum -#define I387_NUM_XMM_REGS tdep->num_xmm_regs - - for (i = I387_ST0_REGNUM; i < I387_MXCSR_REGNUM; i++) + for (i = I387_ST0_REGNUM (tdep); i < I387_MXCSR_REGNUM (tdep); i++) if (regnum == -1 || regnum == i) { /* Most of the FPU control registers occupy only 16 bits in the fxsave area. Give those a special treatment. */ - if (i >= I387_FCTRL_REGNUM && i < I387_XMM0_REGNUM - && i != I387_FIOFF_REGNUM && i != I387_FOOFF_REGNUM) + if (i >= I387_FCTRL_REGNUM (tdep) && i < I387_XMM0_REGNUM (tdep) + && i != I387_FIOFF_REGNUM (tdep) && i != I387_FOOFF_REGNUM (tdep)) { gdb_byte buf[4]; regcache_raw_collect (regcache, i, buf); - if (i == I387_FOP_REGNUM) + if (i == I387_FOP_REGNUM (tdep)) { /* The opcode occupies only 11 bits. Make sure we don't touch the other bits. */ buf[1] &= ((1 << 3) - 1); - buf[1] |= ((FXSAVE_ADDR (regs, i))[1] & ~((1 << 3) - 1)); + buf[1] |= ((FXSAVE_ADDR (tdep, regs, i))[1] & ~((1 << 3) - 1)); } - else if (i == I387_FTAG_REGNUM) + else if (i == I387_FTAG_REGNUM (tdep)) { /* Converting back is much easier. */ @@ -691,18 +659,15 @@ i387_collect_fxsave (const struct regcac buf[0] |= (1 << fpreg); } } - memcpy (FXSAVE_ADDR (regs, i), buf, 2); + memcpy (FXSAVE_ADDR (tdep, regs, i), buf, 2); } else - regcache_raw_collect (regcache, i, FXSAVE_ADDR (regs, i)); + regcache_raw_collect (regcache, i, FXSAVE_ADDR (tdep, regs, i)); } - if (regnum == I387_MXCSR_REGNUM || regnum == -1) - regcache_raw_collect (regcache, I387_MXCSR_REGNUM, + if (regnum == I387_MXCSR_REGNUM (tdep) || regnum == -1) + regcache_raw_collect (regcache, I387_MXCSR_REGNUM (tdep), FXSAVE_MXCSR_ADDR (regs)); - -#undef I387_ST0_REGNUM -#undef I387_NUM_XMM_REGS } /* Recreate the FTW (tag word) valid bits from the 80-bit FP data in @@ -762,22 +727,17 @@ i387_return_value (struct gdbarch *gdbar struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); ULONGEST fstat; - /* Define I387_ST0_REGNUM such that we use the proper - definitions for the architecture. */ -#define I387_ST0_REGNUM tdep->st0_regnum - /* Set the top of the floating-point register stack to 7. The actual value doesn't really matter, but 7 is what a normal function return would end up with if the program started out with a freshly initialized FPU. */ - regcache_raw_read_unsigned (regcache, I387_FSTAT_REGNUM, &fstat); + regcache_raw_read_unsigned (regcache, I387_FSTAT_REGNUM (tdep), &fstat); fstat |= (7 << 11); - regcache_raw_write_unsigned (regcache, I387_FSTAT_REGNUM, fstat); + regcache_raw_write_unsigned (regcache, I387_FSTAT_REGNUM (tdep), fstat); /* Mark %st(1) through %st(7) as empty. Since we set the top of the floating-point register stack to 7, the appropriate value for the tag word is 0x3fff. */ - regcache_raw_write_unsigned (regcache, I387_FTAG_REGNUM, 0x3fff); + regcache_raw_write_unsigned (regcache, I387_FTAG_REGNUM (tdep), 0x3fff); -#undef I387_ST0_REGNUM } diff -urpN src/gdb/i387-tdep.h dev/gdb/i387-tdep.h --- src/gdb/i387-tdep.h 2008-01-01 23:53:11.000000000 +0100 +++ dev/gdb/i387-tdep.h 2008-03-10 07:35:08.000000000 +0100 @@ -27,25 +27,21 @@ struct regcache; struct type; struct ui_file; -/* Because the number of general-purpose registers is different for - AMD64, the floating-point registers and SSE registers get shifted. - The following definitions are intended to help writing code that - needs the register numbers of floating-point registers and SSE - registers. In order to use these, one should provide a definition - for I387_ST0_REGNUM, and possibly I387_NUM_XMM_REGS, preferably by - using a local "#define" in the body of the function that uses this. - Please "#undef" them before the end of the function. */ - -#define I387_FCTRL_REGNUM (I387_ST0_REGNUM + 8) -#define I387_FSTAT_REGNUM (I387_FCTRL_REGNUM + 1) -#define I387_FTAG_REGNUM (I387_FCTRL_REGNUM + 2) -#define I387_FISEG_REGNUM (I387_FCTRL_REGNUM + 3) -#define I387_FIOFF_REGNUM (I387_FCTRL_REGNUM + 4) -#define I387_FOSEG_REGNUM (I387_FCTRL_REGNUM + 5) -#define I387_FOOFF_REGNUM (I387_FCTRL_REGNUM + 6) -#define I387_FOP_REGNUM (I387_FCTRL_REGNUM + 7) -#define I387_XMM0_REGNUM (I387_ST0_REGNUM + 16) -#define I387_MXCSR_REGNUM (I387_XMM0_REGNUM + I387_NUM_XMM_REGS) +#define I387_ST0_REGNUM(tdep) ((tdep)->st0_regnum) +#define I387_NUM_XMM_REGS(tdep) ((tdep)->num_xmm_regs) +#define I387_MM0_REGNUM(tdep) ((tdep)->mm0_regnum) + +#define I387_FCTRL_REGNUM(tdep) (I387_ST0_REGNUM(tdep) + 8) +#define I387_FSTAT_REGNUM(tdep) (I387_FCTRL_REGNUM(tdep)+ 1) +#define I387_FTAG_REGNUM(tdep) (I387_FCTRL_REGNUM(tdep)+ 2) +#define I387_FISEG_REGNUM(tdep) (I387_FCTRL_REGNUM(tdep)+ 3) +#define I387_FIOFF_REGNUM(tdep) (I387_FCTRL_REGNUM(tdep)+ 4) +#define I387_FOSEG_REGNUM(tdep) (I387_FCTRL_REGNUM(tdep)+ 5) +#define I387_FOOFF_REGNUM(tdep) (I387_FCTRL_REGNUM(tdep)+ 6) +#define I387_FOP_REGNUM(tdep) (I387_FCTRL_REGNUM(tdep)+ 7) +#define I387_XMM0_REGNUM(tdep) (I387_ST0_REGNUM(tdep)+ 16) +#define I387_MXCSR_REGNUM(tdep) (I387_XMM0_REGNUM(tdep) \ ++ I387_NUM_XMM_REGS(tdep)) \f /* Print out the i387 floating point state. */ diff -urpN src/gdb/win32-nat.c dev/gdb/win32-nat.c --- src/gdb/win32-nat.c 2008-01-30 05:38:48.000000000 +0100 +++ dev/gdb/win32-nat.c 2008-03-10 07:53:01.000000000 +0100 @@ -359,6 +359,8 @@ static void do_win32_fetch_inferior_registers (struct regcache *regcache, int r) { char *context_offset = ((char *) ¤t_thread->context) + mappings[r]; + struct gdbarch *gdbarch = get_regcache_arch (regcache); + struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); long l; if (!current_thread) @@ -397,14 +399,12 @@ do_win32_fetch_inferior_registers (struc current_thread->reload_context = 0; } -#define I387_ST0_REGNUM I386_ST0_REGNUM - - if (r == I387_FISEG_REGNUM) + if (r == I387_FISEG_REGNUM (tdep)) { l = *((long *) context_offset) & 0xffff; regcache_raw_supply (regcache, r, (char *) &l); } - else if (r == I387_FOP_REGNUM) + else if (r == I387_FOP_REGNUM (tdep)) { l = (*((long *) context_offset) >> 16) & ((1 << 11) - 1); regcache_raw_supply (regcache, r, (char *) &l); @@ -413,11 +413,9 @@ do_win32_fetch_inferior_registers (struc regcache_raw_supply (regcache, r, context_offset); else { - for (r = 0; r < gdbarch_num_regs (get_regcache_arch (regcache)); r++) + for (r = 0; r < gdbarch_num_regs (gdbarch); r++) do_win32_fetch_inferior_registers (regcache, r); } - -#undef I387_ST0_REGNUM } static void ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [rfc] Replace x86 register macros 2008-03-10 6:58 ` Markus Deuling @ 2008-03-10 12:13 ` Ulrich Weigand 2008-03-10 12:23 ` Mark Kettenis 0 siblings, 1 reply; 9+ messages in thread From: Ulrich Weigand @ 2008-03-10 12:13 UTC (permalink / raw) To: Markus Deuling; +Cc: GDB Patches, Daniel Jacobowitz Markus Deuling wrote: > Thanks for review, I reworked the patch now. Ok to commit? > +#define I387_FCTRL_REGNUM(tdep) (I387_ST0_REGNUM(tdep) + 8) > +#define I387_FSTAT_REGNUM(tdep) (I387_FCTRL_REGNUM(tdep)+ 1) > +#define I387_FTAG_REGNUM(tdep) (I387_FCTRL_REGNUM(tdep)+ 2) > +#define I387_FISEG_REGNUM(tdep) (I387_FCTRL_REGNUM(tdep)+ 3) > +#define I387_FIOFF_REGNUM(tdep) (I387_FCTRL_REGNUM(tdep)+ 4) > +#define I387_FOSEG_REGNUM(tdep) (I387_FCTRL_REGNUM(tdep)+ 5) > +#define I387_FOOFF_REGNUM(tdep) (I387_FCTRL_REGNUM(tdep)+ 6) > +#define I387_FOP_REGNUM(tdep) (I387_FCTRL_REGNUM(tdep)+ 7) > +#define I387_XMM0_REGNUM(tdep) (I387_ST0_REGNUM(tdep)+ 16) > +#define I387_MXCSR_REGNUM(tdep) (I387_XMM0_REGNUM(tdep) \ > ++ I387_NUM_XMM_REGS(tdep)) I guess I should have been more specific about the formatting; this is unfortunately still not quite right: On the right-hand sides, you should use normal whitespace rules, i.e. spaces before the '(' and '+'. Also, the last line should be properly indented, somthing like: #define I387_MXCSR_REGNUM(tdep) (I387_XMM0_REGNUM (tdep) \ + I387_NUM_XMM_REGS (tdep)) With these formatting changes, the patch is OK. Thanks, Ulrich -- Dr. Ulrich Weigand GNU Toolchain for Linux on System z and Cell BE Ulrich.Weigand@de.ibm.com ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [rfc] Replace x86 register macros 2008-03-10 12:13 ` Ulrich Weigand @ 2008-03-10 12:23 ` Mark Kettenis 2008-03-11 5:23 ` Markus Deuling 0 siblings, 1 reply; 9+ messages in thread From: Mark Kettenis @ 2008-03-10 12:23 UTC (permalink / raw) To: uweigand; +Cc: deuling, gdb-patches, drow > Date: Mon, 10 Mar 2008 13:13:03 +0100 (CET) > From: "Ulrich Weigand" <uweigand@de.ibm.com> > > Markus Deuling wrote: > > > Thanks for review, I reworked the patch now. Ok to commit? > > > +#define I387_FCTRL_REGNUM(tdep) (I387_ST0_REGNUM(tdep) + 8) > > +#define I387_FSTAT_REGNUM(tdep) (I387_FCTRL_REGNUM(tdep)+ 1) > > +#define I387_FTAG_REGNUM(tdep) (I387_FCTRL_REGNUM(tdep)+ 2) > > +#define I387_FISEG_REGNUM(tdep) (I387_FCTRL_REGNUM(tdep)+ 3) > > +#define I387_FIOFF_REGNUM(tdep) (I387_FCTRL_REGNUM(tdep)+ 4) > > +#define I387_FOSEG_REGNUM(tdep) (I387_FCTRL_REGNUM(tdep)+ 5) > > +#define I387_FOOFF_REGNUM(tdep) (I387_FCTRL_REGNUM(tdep)+ 6) > > +#define I387_FOP_REGNUM(tdep) (I387_FCTRL_REGNUM(tdep)+ 7) > > +#define I387_XMM0_REGNUM(tdep) (I387_ST0_REGNUM(tdep)+ 16) > > +#define I387_MXCSR_REGNUM(tdep) (I387_XMM0_REGNUM(tdep) \ > > ++ I387_NUM_XMM_REGS(tdep)) > > I guess I should have been more specific about the formatting; > this is unfortunately still not quite right: On the right-hand > sides, you should use normal whitespace rules, i.e. spaces before > the '(' and '+'. Also, the last line should be properly > indented, somthing like: > > #define I387_MXCSR_REGNUM(tdep) (I387_XMM0_REGNUM (tdep) \ > + I387_NUM_XMM_REGS (tdep)) Or better yet, something like: #define I387_MXCSR_REGNUM(tdep) \ (I387_XMM0_REGNUM (tdep) + I387_NUM_XMM_REGS (tdep)) ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [rfc] Replace x86 register macros 2008-03-10 12:23 ` Mark Kettenis @ 2008-03-11 5:23 ` Markus Deuling 0 siblings, 0 replies; 9+ messages in thread From: Markus Deuling @ 2008-03-11 5:23 UTC (permalink / raw) To: gdb-patches; +Cc: Mark Kettenis, uweigand, drow Mark Kettenis schrieb: >> Date: Mon, 10 Mar 2008 13:13:03 +0100 (CET) >> From: "Ulrich Weigand" <uweigand@de.ibm.com> >> >> Markus Deuling wrote: >> >>> Thanks for review, I reworked the patch now. Ok to commit? >>> +#define I387_FCTRL_REGNUM(tdep) (I387_ST0_REGNUM(tdep) + 8) >>> +#define I387_FSTAT_REGNUM(tdep) (I387_FCTRL_REGNUM(tdep)+ 1) >>> +#define I387_FTAG_REGNUM(tdep) (I387_FCTRL_REGNUM(tdep)+ 2) >>> +#define I387_FISEG_REGNUM(tdep) (I387_FCTRL_REGNUM(tdep)+ 3) >>> +#define I387_FIOFF_REGNUM(tdep) (I387_FCTRL_REGNUM(tdep)+ 4) >>> +#define I387_FOSEG_REGNUM(tdep) (I387_FCTRL_REGNUM(tdep)+ 5) >>> +#define I387_FOOFF_REGNUM(tdep) (I387_FCTRL_REGNUM(tdep)+ 6) >>> +#define I387_FOP_REGNUM(tdep) (I387_FCTRL_REGNUM(tdep)+ 7) >>> +#define I387_XMM0_REGNUM(tdep) (I387_ST0_REGNUM(tdep)+ 16) >>> +#define I387_MXCSR_REGNUM(tdep) (I387_XMM0_REGNUM(tdep) \ >>> ++ I387_NUM_XMM_REGS(tdep)) >> I guess I should have been more specific about the formatting; >> this is unfortunately still not quite right: On the right-hand >> sides, you should use normal whitespace rules, i.e. spaces before >> the '(' and '+'. Also, the last line should be properly >> indented, somthing like: >> >> #define I387_MXCSR_REGNUM(tdep) (I387_XMM0_REGNUM (tdep) \ >> + I387_NUM_XMM_REGS (tdep)) > > Or better yet, something like: > > #define I387_MXCSR_REGNUM(tdep) \ > (I387_XMM0_REGNUM (tdep) + I387_NUM_XMM_REGS (tdep)) > Thank you. I've committed a corrected version now. Regards, Markus -- Markus Deuling GNU Toolchain for Linux on Cell BE deuling@de.ibm.com ^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2008-03-11 5:23 UTC | newest] Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2008-02-18 20:42 [rfc] Replace x86 register macros Markus Deuling 2008-02-19 15:45 ` Ulrich Weigand 2008-02-19 16:21 ` Daniel Jacobowitz 2008-02-20 16:45 ` Markus Deuling 2008-03-04 0:32 ` Ulrich Weigand 2008-03-10 6:58 ` Markus Deuling 2008-03-10 12:13 ` Ulrich Weigand 2008-03-10 12:23 ` Mark Kettenis 2008-03-11 5:23 ` Markus Deuling
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox