]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blob - sim/common/cgen-mem.h
Initial creation of sourceware repository
[thirdparty/binutils-gdb.git] / sim / common / cgen-mem.h
1 /* Memory ops header for CGEN-based simulators.
2 Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
3 Contributed by Cygnus Solutions.
4
5 This file is part of the GNU Simulators.
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
9 the Free Software Foundation; either version 2, or (at your option)
10 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 along
18 with this program; if not, write to the Free Software Foundation, Inc.,
19 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
20
21 #ifndef CGEN_MEM_H
22 #define CGEN_MEM_H
23
24 #ifdef MEMOPS_DEFINE_INLINE
25 #define MEMOPS_INLINE
26 #else
27 #define MEMOPS_INLINE extern inline
28 #endif
29
30 /* Memory read support. */
31
32 #if defined (__GNUC__) || defined (MEMOPS_DEFINE_INLINE)
33 #define DECLARE_GETMEM(mode, size) \
34 MEMOPS_INLINE mode \
35 XCONCAT2 (GETMEM,mode) (SIM_CPU *cpu, IADDR pc, ADDR a) \
36 { \
37 PROFILE_COUNT_READ (cpu, a, XCONCAT2 (MODE_,mode)); \
38 /* Don't read anything into "unaligned" here. Bad name choice. */\
39 return XCONCAT2 (sim_core_read_unaligned_,size) (cpu, pc, read_map, a); \
40 }
41 #else
42 #define DECLARE_GETMEM(mode, size) \
43 extern mode XCONCAT2 (GETMEM,mode) (SIM_CPU *, IADDR, ADDR);
44 #endif
45
46 DECLARE_GETMEM (QI, 1)
47 DECLARE_GETMEM (UQI, 1)
48 DECLARE_GETMEM (HI, 2)
49 DECLARE_GETMEM (UHI, 2)
50 DECLARE_GETMEM (SI, 4)
51 DECLARE_GETMEM (USI, 4)
52 DECLARE_GETMEM (DI, 8)
53 DECLARE_GETMEM (UDI, 8)
54
55 #undef DECLARE_GETMEM
56
57 #if defined (__GNUC__) || defined (MEMOPS_DEFINE_INLINE)
58 #define DECLARE_GETMEM(mode, size) \
59 MEMOPS_INLINE mode \
60 XCONCAT2 (GETMEM,mode) (SIM_CPU *cpu, IADDR pc, ADDR a) \
61 { \
62 PROFILE_COUNT_READ (cpu, a, XCONCAT2 (MODE_,mode)); \
63 /* Don't read anything into "unaligned" here. Bad name choice. */\
64 return XCONCAT2 (sim_core_read_unaligned_,size) (cpu, pc, read_map, a); \
65 }
66 #else
67 #define DECLARE_GETMEM(mode, size) \
68 extern mode XCONCAT2 (GETMEM,mode) (SIM_CPU *, IADDR, ADDR);
69 #endif
70
71 DECLARE_GETMEM (SF, 4)
72 DECLARE_GETMEM (DF, 8)
73 /*DECLARE_GETMEM (TF, 16)*/
74
75 #undef DECLARE_GETMEM
76 \f
77 /* Memory write support. */
78
79 #if defined (__GNUC__) || defined (MEMOPS_DEFINE_INLINE)
80 #define DECLARE_SETMEM(mode, size) \
81 MEMOPS_INLINE void \
82 XCONCAT2 (SETMEM,mode) (SIM_CPU *cpu, IADDR pc, ADDR a, mode val) \
83 { \
84 PROFILE_COUNT_WRITE (cpu, a, XCONCAT2 (MODE_,mode)); \
85 /* Don't read anything into "unaligned" here. Bad name choice. */ \
86 XCONCAT2 (sim_core_write_unaligned_,size) (cpu, pc, write_map, a, val); \
87 }
88 #else
89 #define DECLARE_SETMEM(mode, size) \
90 extern void XCONCAT2 (SETMEM,mode) (SIM_CPU *, IADDR, ADDR, mode);
91 #endif
92
93 DECLARE_SETMEM (QI, 1)
94 DECLARE_SETMEM (UQI, 1)
95 DECLARE_SETMEM (HI, 2)
96 DECLARE_SETMEM (UHI, 2)
97 DECLARE_SETMEM (SI, 4)
98 DECLARE_SETMEM (USI, 4)
99 DECLARE_SETMEM (DI, 8)
100 DECLARE_SETMEM (UDI, 8)
101
102 /*
103 DECLARE_SETMEM (SF, 4)
104 DECLARE_SETMEM (DF, 8)
105 DECLARE_SETMEM (TF, 16)
106 */
107
108 #undef DECLARE_SETMEM
109 \f
110 /* Instruction read support. */
111
112 #if defined (__GNUC__) || defined (MEMOPS_DEFINE_INLINE)
113 #define DECLARE_GETIMEM(mode, size) \
114 MEMOPS_INLINE mode \
115 XCONCAT2 (GETIMEM,mode) (SIM_CPU *cpu, IADDR a) \
116 { \
117 /*PROFILE_COUNT_READ (cpu, a, XCONCAT2 (MODE_,mode));*/ \
118 /* Don't read anything into "unaligned" here. Bad name choice. */\
119 return XCONCAT2 (sim_core_read_unaligned_,size) (cpu, a, exec_map, a); \
120 }
121 #else
122 #define DECLARE_GETIMEM(mode, size) \
123 extern mode XCONCAT2 (GETIMEM,mode) (SIM_CPU *, ADDR);
124 #endif
125
126 DECLARE_GETIMEM (UQI, 1)
127 DECLARE_GETIMEM (UHI, 2)
128 DECLARE_GETIMEM (USI, 4)
129 DECLARE_GETIMEM (UDI, 8)
130
131 #undef DECLARE_GETIMEM
132 \f
133 /* GETT<mode>: translate target value at P to host value.
134 This needn't be very efficient (i.e. can call memcpy) as this is
135 only used when interfacing with the outside world (e.g. gdb). */
136
137 #if defined (__GNUC__) || defined (MEMOPS_DEFINE_INLINE)
138 #define DECLARE_GETT(mode, size) \
139 MEMOPS_INLINE mode \
140 XCONCAT2 (GETT,mode) (unsigned char *p) \
141 { \
142 mode tmp; \
143 memcpy (&tmp, p, sizeof (mode)); \
144 return XCONCAT2 (T2H_,size) (tmp); \
145 }
146 #else
147 #define DECLARE_GETT(mode, size) \
148 extern mode XCONCAT2 (GETT,mode) (unsigned char *);
149 #endif
150
151 DECLARE_GETT (QI, 1)
152 DECLARE_GETT (UQI, 1)
153 DECLARE_GETT (HI, 2)
154 DECLARE_GETT (UHI, 2)
155 DECLARE_GETT (SI, 4)
156 DECLARE_GETT (USI, 4)
157 DECLARE_GETT (DI, 8)
158 DECLARE_GETT (UDI, 8)
159
160 /*
161 DECLARE_GETT (SF, 4)
162 DECLARE_GETT (DF, 8)
163 DECLARE_GETT (TF, 16)
164 */
165
166 #undef DECLARE_GETT
167 \f
168 /* SETT<mode>: translate host value to target value and store at P.
169 This needn't be very efficient (i.e. can call memcpy) as this is
170 only used when interfacing with the outside world (e.g. gdb). */
171
172 #if defined (__GNUC__) || defined (MEMOPS_DEFINE_INLINE)
173 #define DECLARE_SETT(mode, size) \
174 MEMOPS_INLINE void \
175 XCONCAT2 (SETT,mode) (unsigned char *buf, mode val) \
176 { \
177 mode tmp; \
178 tmp = XCONCAT2 (H2T_,size) (val); \
179 memcpy (buf, &tmp, sizeof (mode)); \
180 }
181 #else
182 #define DECLARE_SETT(mode, size) \
183 extern mode XCONCAT2 (GETT,mode) (unsigned char *, mode);
184 #endif
185
186 DECLARE_SETT (QI, 1)
187 DECLARE_SETT (UQI, 1)
188 DECLARE_SETT (HI, 2)
189 DECLARE_SETT (UHI, 2)
190 DECLARE_SETT (SI, 4)
191 DECLARE_SETT (USI, 4)
192 DECLARE_SETT (DI, 8)
193 DECLARE_SETT (UDI, 8)
194
195 /*
196 DECLARE_SETT (SF, 4)
197 DECLARE_SETT (DF, 8)
198 DECLARE_SETT (TF, 16)
199 */
200
201 #undef DECLARE_SETT
202
203 #endif /* CGEN_MEM_H */