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