Merge {i386,amd64}_linux_read_description
[deliverable/binutils-gdb.git] / gdb / i387-tdep.h
CommitLineData
e750d25e 1/* Target-dependent code for the i387.
2de139ba 2
ecd75fc8 3 Copyright (C) 2000-2014 Free Software Foundation, Inc.
b2450fc5
MK
4
5 This file is part of GDB.
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
a9762ec7 9 the Free Software Foundation; either version 3 of the License, or
b2450fc5
MK
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
a9762ec7 18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
b2450fc5 19
e750d25e
JT
20#ifndef I387_TDEP_H
21#define I387_TDEP_H
b2450fc5 22
da3331ec 23struct gdbarch;
da3331ec 24struct frame_info;
41d041d6 25struct regcache;
d532c08f 26struct type;
41d041d6 27struct ui_file;
da3331ec 28
90884b2b
L
29/* Number of i387 floating point registers. */
30#define I387_NUM_REGS 16
31
20a6ec49
MD
32#define I387_ST0_REGNUM(tdep) ((tdep)->st0_regnum)
33#define I387_NUM_XMM_REGS(tdep) ((tdep)->num_xmm_regs)
01f9f808 34#define I387_NUM_XMM_AVX512_REGS(tdep) ((tdep)->num_xmm_avx512_regs)
20a6ec49 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)
01f9f808 38
1dbcd68c
WT
39#define I387_BND0R_REGNUM(tdep) ((tdep)->bnd0r_regnum)
40#define I387_BNDCFGU_REGNUM(tdep) ((tdep)->bndcfgu_regnum)
41
42/* Set of constants used for 32 and 64-bit. */
43#define I387_NUM_MPX_REGS 6
44#define I387_NUM_BND_REGS 4
45#define I387_NUM_MPX_CTRL_REGS 2
01f9f808
MS
46#define I387_NUM_K_REGS 8
47
48#define I387_K0_REGNUM(tdep) ((tdep)->k0_regnum)
49#define I387_NUM_ZMMH_REGS(tdep) ((tdep)->num_zmm_regs)
50#define I387_ZMM0H_REGNUM(tdep) ((tdep)->zmm0h_regnum)
51#define I387_NUM_YMM_AVX512_REGS(tdep) ((tdep)->num_ymm_avx512_regs)
52#define I387_YMM16H_REGNUM(tdep) ((tdep)->ymm16h_regnum)
20a6ec49
MD
53
54#define I387_FCTRL_REGNUM(tdep) (I387_ST0_REGNUM (tdep) + 8)
55#define I387_FSTAT_REGNUM(tdep) (I387_FCTRL_REGNUM (tdep) + 1)
56#define I387_FTAG_REGNUM(tdep) (I387_FCTRL_REGNUM (tdep) + 2)
57#define I387_FISEG_REGNUM(tdep) (I387_FCTRL_REGNUM (tdep) + 3)
58#define I387_FIOFF_REGNUM(tdep) (I387_FCTRL_REGNUM (tdep) + 4)
59#define I387_FOSEG_REGNUM(tdep) (I387_FCTRL_REGNUM (tdep) + 5)
60#define I387_FOOFF_REGNUM(tdep) (I387_FCTRL_REGNUM (tdep) + 6)
61#define I387_FOP_REGNUM(tdep) (I387_FCTRL_REGNUM (tdep) + 7)
62#define I387_XMM0_REGNUM(tdep) (I387_ST0_REGNUM (tdep) + 16)
01f9f808 63#define I387_XMM16_REGNUM(tdep) ((tdep)->xmm16_regnum)
20a6ec49
MD
64#define I387_MXCSR_REGNUM(tdep) \
65 (I387_XMM0_REGNUM (tdep) + I387_NUM_XMM_REGS (tdep))
01f9f808 66#define I387_YMM0_REGNUM(tdep) (I387_MXCSR_REGNUM(tdep) + 1)
31aeac78
L
67#define I387_YMMENDH_REGNUM(tdep) \
68 (I387_YMM0H_REGNUM (tdep) + I387_NUM_YMM_REGS (tdep))
01f9f808 69
1dbcd68c
WT
70#define I387_MPXEND_REGNUM(tdep) \
71 (I387_BND0R_REGNUM (tdep) + I387_NUM_MPX_REGS)
5716833c 72
01f9f808
MS
73#define I387_KEND_REGNUM(tdep) \
74 (I387_K0_REGNUM (tdep) + I387_NUM_K_REGS)
75#define I387_ZMMENDH_REGNUM(tdep) \
76 (I387_ZMM0H_REGNUM (tdep) + I387_NUM_ZMMH_REGS (tdep))
77#define I387_YMMH_AVX512_END_REGNUM(tdep) \
78 (I387_YMM16H_REGNUM (tdep) + I387_NUM_YMM_AVX512_REGS (tdep))
79#define I387_XMM_AVX512_END_REGNUM(tdep) \
80 (I387_XMM16_REGNUM (tdep) + I387_NUM_XMM_AVX512_REGS (tdep))
81
61113f8b
MK
82/* Print out the i387 floating point state. */
83
84extern void i387_print_float_info (struct gdbarch *gdbarch,
85 struct ui_file *file,
8e186fd6
AC
86 struct frame_info *frame,
87 const char *args);
61113f8b 88
83acabca
DJ
89/* Return nonzero if a value of type TYPE stored in register REGNUM
90 needs any special handling. */
91
0abe36f5
MD
92extern int i387_convert_register_p (struct gdbarch *gdbarch, int regnum,
93 struct type *type);
83acabca 94
d532c08f
MK
95/* Read a value of type TYPE from register REGNUM in frame FRAME, and
96 return its contents in TO. */
97
8dccd430
PA
98extern int i387_register_to_value (struct frame_info *frame, int regnum,
99 struct type *type, gdb_byte *to,
100 int *optimizedp, int *unavailablep);
d532c08f
MK
101
102/* Write the contents FROM of a value of type TYPE into register
103 REGNUM in frame FRAME. */
104
105extern void i387_value_to_register (struct frame_info *frame, int regnum,
42835c2b 106 struct type *type, const gdb_byte *from);
2de139ba
MK
107\f
108
109/* Size of the memory area use by the 'fsave' and 'fxsave'
110 instructions. */
111#define I387_SIZEOF_FSAVE 108
112#define I387_SIZEOF_FXSAVE 512
d532c08f 113
41d041d6
MK
114/* Fill register REGNUM in REGCACHE with the appropriate value from
115 *FSAVE. This function masks off any of the reserved bits in
116 *FSAVE. */
f31e928c 117
41d041d6
MK
118extern void i387_supply_fsave (struct regcache *regcache, int regnum,
119 const void *fsave);
b2450fc5 120
63b6c53f
MK
121/* Fill register REGNUM (if it is a floating-point register) in *FSAVE
122 with the value from REGCACHE. If REGNUM is -1, do this for all
123 registers. This function doesn't touch any of the reserved bits in
124 *FSAVE. */
125
126extern void i387_collect_fsave (const struct regcache *regcache, int regnum,
127 void *fsave);
128
41d041d6 129/* Fill register REGNUM in REGCACHE with the appropriate
ed504bdf
MK
130 floating-point or SSE register value from *FXSAVE. This function
131 masks off any of the reserved bits in *FXSAVE. */
e2890f08 132
41d041d6
MK
133extern void i387_supply_fxsave (struct regcache *regcache, int regnum,
134 const void *fxsave);
e2890f08 135
31aeac78
L
136/* Similar to i387_supply_fxsave, but use XSAVE extended state. */
137
138extern void i387_supply_xsave (struct regcache *regcache, int regnum,
139 const void *xsave);
140
80571bff
MK
141/* Fill register REGNUM (if it is a floating-point or SSE register) in
142 *FXSAVE with the value from REGCACHE. If REGNUM is -1, do this for
143 all registers. This function doesn't touch any of the reserved
144 bits in *FXSAVE. */
145
146extern void i387_collect_fxsave (const struct regcache *regcache, int regnum,
147 void *fxsave);
148
31aeac78
L
149/* Similar to i387_collect_fxsave, but use XSAVE extended state. */
150
151extern void i387_collect_xsave (const struct regcache *regcache,
152 int regnum, void *xsave, int gcore);
153
efb1c01c
MK
154/* Prepare the FPU stack in REGCACHE for a function return. */
155
156extern void i387_return_value (struct gdbarch *gdbarch,
157 struct regcache *regcache);
158
e750d25e 159#endif /* i387-tdep.h */
This page took 1.09042 seconds and 4 git commands to generate.