gdb: add target_ops::supports_displaced_step
[deliverable/binutils-gdb.git] / gdb / i387-tdep.h
CommitLineData
e750d25e 1/* Target-dependent code for the i387.
2de139ba 2
b811d2c2 3 Copyright (C) 2000-2020 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 46#define I387_NUM_K_REGS 8
51547df6 47#define I387_NUM_PKEYS_REGS 1
01f9f808 48
51547df6 49#define I387_PKRU_REGNUM(tdep) ((tdep)->pkru_regnum)
01f9f808
MS
50#define I387_K0_REGNUM(tdep) ((tdep)->k0_regnum)
51#define I387_NUM_ZMMH_REGS(tdep) ((tdep)->num_zmm_regs)
52#define I387_ZMM0H_REGNUM(tdep) ((tdep)->zmm0h_regnum)
53#define I387_NUM_YMM_AVX512_REGS(tdep) ((tdep)->num_ymm_avx512_regs)
54#define I387_YMM16H_REGNUM(tdep) ((tdep)->ymm16h_regnum)
20a6ec49
MD
55
56#define I387_FCTRL_REGNUM(tdep) (I387_ST0_REGNUM (tdep) + 8)
57#define I387_FSTAT_REGNUM(tdep) (I387_FCTRL_REGNUM (tdep) + 1)
58#define I387_FTAG_REGNUM(tdep) (I387_FCTRL_REGNUM (tdep) + 2)
59#define I387_FISEG_REGNUM(tdep) (I387_FCTRL_REGNUM (tdep) + 3)
60#define I387_FIOFF_REGNUM(tdep) (I387_FCTRL_REGNUM (tdep) + 4)
61#define I387_FOSEG_REGNUM(tdep) (I387_FCTRL_REGNUM (tdep) + 5)
62#define I387_FOOFF_REGNUM(tdep) (I387_FCTRL_REGNUM (tdep) + 6)
63#define I387_FOP_REGNUM(tdep) (I387_FCTRL_REGNUM (tdep) + 7)
64#define I387_XMM0_REGNUM(tdep) (I387_ST0_REGNUM (tdep) + 16)
01f9f808 65#define I387_XMM16_REGNUM(tdep) ((tdep)->xmm16_regnum)
20a6ec49
MD
66#define I387_MXCSR_REGNUM(tdep) \
67 (I387_XMM0_REGNUM (tdep) + I387_NUM_XMM_REGS (tdep))
01f9f808 68#define I387_YMM0_REGNUM(tdep) (I387_MXCSR_REGNUM(tdep) + 1)
31aeac78
L
69#define I387_YMMENDH_REGNUM(tdep) \
70 (I387_YMM0H_REGNUM (tdep) + I387_NUM_YMM_REGS (tdep))
01f9f808 71
1dbcd68c
WT
72#define I387_MPXEND_REGNUM(tdep) \
73 (I387_BND0R_REGNUM (tdep) + I387_NUM_MPX_REGS)
5716833c 74
01f9f808
MS
75#define I387_KEND_REGNUM(tdep) \
76 (I387_K0_REGNUM (tdep) + I387_NUM_K_REGS)
77#define I387_ZMMENDH_REGNUM(tdep) \
78 (I387_ZMM0H_REGNUM (tdep) + I387_NUM_ZMMH_REGS (tdep))
79#define I387_YMMH_AVX512_END_REGNUM(tdep) \
80 (I387_YMM16H_REGNUM (tdep) + I387_NUM_YMM_AVX512_REGS (tdep))
81#define I387_XMM_AVX512_END_REGNUM(tdep) \
82 (I387_XMM16_REGNUM (tdep) + I387_NUM_XMM_AVX512_REGS (tdep))
83
51547df6
MS
84#define I387_PKEYSEND_REGNUM(tdep) \
85 (I387_PKRU_REGNUM (tdep) + I387_NUM_PKEYS_REGS)
86
61113f8b
MK
87/* Print out the i387 floating point state. */
88
89extern void i387_print_float_info (struct gdbarch *gdbarch,
90 struct ui_file *file,
8e186fd6
AC
91 struct frame_info *frame,
92 const char *args);
61113f8b 93
83acabca
DJ
94/* Return nonzero if a value of type TYPE stored in register REGNUM
95 needs any special handling. */
96
0abe36f5
MD
97extern int i387_convert_register_p (struct gdbarch *gdbarch, int regnum,
98 struct type *type);
83acabca 99
d532c08f
MK
100/* Read a value of type TYPE from register REGNUM in frame FRAME, and
101 return its contents in TO. */
102
8dccd430
PA
103extern int i387_register_to_value (struct frame_info *frame, int regnum,
104 struct type *type, gdb_byte *to,
105 int *optimizedp, int *unavailablep);
d532c08f
MK
106
107/* Write the contents FROM of a value of type TYPE into register
108 REGNUM in frame FRAME. */
109
110extern void i387_value_to_register (struct frame_info *frame, int regnum,
42835c2b 111 struct type *type, const gdb_byte *from);
2de139ba
MK
112\f
113
114/* Size of the memory area use by the 'fsave' and 'fxsave'
115 instructions. */
116#define I387_SIZEOF_FSAVE 108
117#define I387_SIZEOF_FXSAVE 512
d532c08f 118
41d041d6
MK
119/* Fill register REGNUM in REGCACHE with the appropriate value from
120 *FSAVE. This function masks off any of the reserved bits in
121 *FSAVE. */
f31e928c 122
41d041d6
MK
123extern void i387_supply_fsave (struct regcache *regcache, int regnum,
124 const void *fsave);
b2450fc5 125
63b6c53f
MK
126/* Fill register REGNUM (if it is a floating-point register) in *FSAVE
127 with the value from REGCACHE. If REGNUM is -1, do this for all
128 registers. This function doesn't touch any of the reserved bits in
129 *FSAVE. */
130
131extern void i387_collect_fsave (const struct regcache *regcache, int regnum,
132 void *fsave);
133
41d041d6 134/* Fill register REGNUM in REGCACHE with the appropriate
ed504bdf
MK
135 floating-point or SSE register value from *FXSAVE. This function
136 masks off any of the reserved bits in *FXSAVE. */
e2890f08 137
41d041d6
MK
138extern void i387_supply_fxsave (struct regcache *regcache, int regnum,
139 const void *fxsave);
e2890f08 140
31aeac78
L
141/* Similar to i387_supply_fxsave, but use XSAVE extended state. */
142
143extern void i387_supply_xsave (struct regcache *regcache, int regnum,
144 const void *xsave);
145
80571bff
MK
146/* Fill register REGNUM (if it is a floating-point or SSE register) in
147 *FXSAVE with the value from REGCACHE. If REGNUM is -1, do this for
148 all registers. This function doesn't touch any of the reserved
149 bits in *FXSAVE. */
150
151extern void i387_collect_fxsave (const struct regcache *regcache, int regnum,
152 void *fxsave);
153
31aeac78
L
154/* Similar to i387_collect_fxsave, but use XSAVE extended state. */
155
156extern void i387_collect_xsave (const struct regcache *regcache,
157 int regnum, void *xsave, int gcore);
158
8ee22052
AB
159/* Extract a bitset from XSAVE indicating which features are available in
160 the inferior, but not yet initialised. */
161
162extern ULONGEST i387_xsave_get_clear_bv (struct gdbarch *gdbarch,
163 const void *xsave);
164
efb1c01c
MK
165/* Prepare the FPU stack in REGCACHE for a function return. */
166
167extern void i387_return_value (struct gdbarch *gdbarch,
168 struct regcache *regcache);
169
4a612d6f
WT
170/* Set all bnd registers to the INIT state. INIT state means
171 all memory range can be accessed. */
172extern void i387_reset_bnd_regs (struct gdbarch *gdbarch,
173 struct regcache *regcache);
e750d25e 174#endif /* i387-tdep.h */
This page took 1.565642 seconds and 4 git commands to generate.