]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/i387-tdep.h
gdb/
[thirdparty/binutils-gdb.git] / gdb / i387-tdep.h
CommitLineData
e750d25e 1/* Target-dependent code for the i387.
2de139ba 2
7b6bb8da 3 Copyright (C) 2000, 2001, 2002, 2003, 2004, 2007, 2008, 2009, 2010, 2011
6aba47ca 4 Free Software Foundation, Inc.
b2450fc5
MK
5
6 This file is part of GDB.
7
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
a9762ec7 10 the Free Software Foundation; either version 3 of the License, or
b2450fc5
MK
11 (at your option) any later version.
12
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
a9762ec7 19 along with this program. If not, see <http://www.gnu.org/licenses/>. */
b2450fc5 20
e750d25e
JT
21#ifndef I387_TDEP_H
22#define I387_TDEP_H
b2450fc5 23
da3331ec 24struct gdbarch;
da3331ec 25struct frame_info;
41d041d6 26struct regcache;
d532c08f 27struct type;
41d041d6 28struct ui_file;
da3331ec 29
90884b2b
L
30/* Number of i387 floating point registers. */
31#define I387_NUM_REGS 16
32
20a6ec49
MD
33#define I387_ST0_REGNUM(tdep) ((tdep)->st0_regnum)
34#define I387_NUM_XMM_REGS(tdep) ((tdep)->num_xmm_regs)
35#define I387_MM0_REGNUM(tdep) ((tdep)->mm0_regnum)
31aeac78
L
36#define I387_NUM_YMM_REGS(tdep) ((tdep)->num_ymm_regs)
37#define I387_YMM0H_REGNUM(tdep) ((tdep)->ymm0h_regnum)
20a6ec49
MD
38
39#define I387_FCTRL_REGNUM(tdep) (I387_ST0_REGNUM (tdep) + 8)
40#define I387_FSTAT_REGNUM(tdep) (I387_FCTRL_REGNUM (tdep) + 1)
41#define I387_FTAG_REGNUM(tdep) (I387_FCTRL_REGNUM (tdep) + 2)
42#define I387_FISEG_REGNUM(tdep) (I387_FCTRL_REGNUM (tdep) + 3)
43#define I387_FIOFF_REGNUM(tdep) (I387_FCTRL_REGNUM (tdep) + 4)
44#define I387_FOSEG_REGNUM(tdep) (I387_FCTRL_REGNUM (tdep) + 5)
45#define I387_FOOFF_REGNUM(tdep) (I387_FCTRL_REGNUM (tdep) + 6)
46#define I387_FOP_REGNUM(tdep) (I387_FCTRL_REGNUM (tdep) + 7)
47#define I387_XMM0_REGNUM(tdep) (I387_ST0_REGNUM (tdep) + 16)
48#define I387_MXCSR_REGNUM(tdep) \
49 (I387_XMM0_REGNUM (tdep) + I387_NUM_XMM_REGS (tdep))
31aeac78
L
50#define I387_YMMENDH_REGNUM(tdep) \
51 (I387_YMM0H_REGNUM (tdep) + I387_NUM_YMM_REGS (tdep))
5716833c 52
61113f8b
MK
53/* Print out the i387 floating point state. */
54
55extern void i387_print_float_info (struct gdbarch *gdbarch,
56 struct ui_file *file,
8e186fd6
AC
57 struct frame_info *frame,
58 const char *args);
61113f8b 59
83acabca
DJ
60/* Return nonzero if a value of type TYPE stored in register REGNUM
61 needs any special handling. */
62
0abe36f5
MD
63extern int i387_convert_register_p (struct gdbarch *gdbarch, int regnum,
64 struct type *type);
83acabca 65
d532c08f
MK
66/* Read a value of type TYPE from register REGNUM in frame FRAME, and
67 return its contents in TO. */
68
69extern void i387_register_to_value (struct frame_info *frame, int regnum,
42835c2b 70 struct type *type, gdb_byte *to);
d532c08f
MK
71
72/* Write the contents FROM of a value of type TYPE into register
73 REGNUM in frame FRAME. */
74
75extern void i387_value_to_register (struct frame_info *frame, int regnum,
42835c2b 76 struct type *type, const gdb_byte *from);
2de139ba
MK
77\f
78
79/* Size of the memory area use by the 'fsave' and 'fxsave'
80 instructions. */
81#define I387_SIZEOF_FSAVE 108
82#define I387_SIZEOF_FXSAVE 512
d532c08f 83
41d041d6
MK
84/* Fill register REGNUM in REGCACHE with the appropriate value from
85 *FSAVE. This function masks off any of the reserved bits in
86 *FSAVE. */
f31e928c 87
41d041d6
MK
88extern void i387_supply_fsave (struct regcache *regcache, int regnum,
89 const void *fsave);
b2450fc5 90
63b6c53f
MK
91/* Fill register REGNUM (if it is a floating-point register) in *FSAVE
92 with the value from REGCACHE. If REGNUM is -1, do this for all
93 registers. This function doesn't touch any of the reserved bits in
94 *FSAVE. */
95
96extern void i387_collect_fsave (const struct regcache *regcache, int regnum,
97 void *fsave);
98
41d041d6 99/* Fill register REGNUM in REGCACHE with the appropriate
ed504bdf
MK
100 floating-point or SSE register value from *FXSAVE. This function
101 masks off any of the reserved bits in *FXSAVE. */
e2890f08 102
41d041d6
MK
103extern void i387_supply_fxsave (struct regcache *regcache, int regnum,
104 const void *fxsave);
e2890f08 105
31aeac78
L
106/* Similar to i387_supply_fxsave, but use XSAVE extended state. */
107
108extern void i387_supply_xsave (struct regcache *regcache, int regnum,
109 const void *xsave);
110
80571bff
MK
111/* Fill register REGNUM (if it is a floating-point or SSE register) in
112 *FXSAVE with the value from REGCACHE. If REGNUM is -1, do this for
113 all registers. This function doesn't touch any of the reserved
114 bits in *FXSAVE. */
115
116extern void i387_collect_fxsave (const struct regcache *regcache, int regnum,
117 void *fxsave);
118
31aeac78
L
119/* Similar to i387_collect_fxsave, but use XSAVE extended state. */
120
121extern void i387_collect_xsave (const struct regcache *regcache,
122 int regnum, void *xsave, int gcore);
123
efb1c01c
MK
124/* Prepare the FPU stack in REGCACHE for a function return. */
125
126extern void i387_return_value (struct gdbarch *gdbarch,
127 struct regcache *regcache);
128
e750d25e 129#endif /* i387-tdep.h */