]>
git.ipfire.org Git - thirdparty/binutils-gdb.git/blob - 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.
5 This file is part of the GNU Simulators.
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)
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.
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. */
24 #ifdef MEMOPS_DEFINE_INLINE
27 #define MEMOPS_INLINE extern inline
30 /* Memory read support. */
32 #if defined (__GNUC__) || defined (MEMOPS_DEFINE_INLINE)
33 #define DECLARE_GETMEM(mode, size) \
35 XCONCAT2 (GETMEM,mode) (SIM_CPU *cpu, IADDR pc, ADDR a) \
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); \
42 #define DECLARE_GETMEM(mode, size) \
43 extern mode XCONCAT2 (GETMEM,mode) (SIM_CPU *, IADDR, ADDR);
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)
57 #if defined (__GNUC__) || defined (MEMOPS_DEFINE_INLINE)
58 #define DECLARE_GETMEM(mode, size) \
60 XCONCAT2 (GETMEM,mode) (SIM_CPU *cpu, IADDR pc, ADDR a) \
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); \
67 #define DECLARE_GETMEM(mode, size) \
68 extern mode XCONCAT2 (GETMEM,mode) (SIM_CPU *, IADDR, ADDR);
71 DECLARE_GETMEM (SF
, 4)
72 DECLARE_GETMEM (DF
, 8)
73 /*DECLARE_GETMEM (TF, 16)*/
77 /* Memory write support. */
79 #if defined (__GNUC__) || defined (MEMOPS_DEFINE_INLINE)
80 #define DECLARE_SETMEM(mode, size) \
82 XCONCAT2 (SETMEM,mode) (SIM_CPU *cpu, IADDR pc, ADDR a, mode val) \
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); \
89 #define DECLARE_SETMEM(mode, size) \
90 extern void XCONCAT2 (SETMEM,mode) (SIM_CPU *, IADDR, ADDR, mode);
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)
103 DECLARE_SETMEM (SF, 4)
104 DECLARE_SETMEM (DF, 8)
105 DECLARE_SETMEM (TF, 16)
108 #undef DECLARE_SETMEM
110 /* Instruction read support. */
112 #if defined (__GNUC__) || defined (MEMOPS_DEFINE_INLINE)
113 #define DECLARE_GETIMEM(mode, size) \
115 XCONCAT2 (GETIMEM,mode) (SIM_CPU *cpu, IADDR a) \
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); \
122 #define DECLARE_GETIMEM(mode, size) \
123 extern mode XCONCAT2 (GETIMEM,mode) (SIM_CPU *, ADDR);
126 DECLARE_GETIMEM (UQI
, 1)
127 DECLARE_GETIMEM (UHI
, 2)
128 DECLARE_GETIMEM (USI
, 4)
129 DECLARE_GETIMEM (UDI
, 8)
131 #undef DECLARE_GETIMEM
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). */
137 #if defined (__GNUC__) || defined (MEMOPS_DEFINE_INLINE)
138 #define DECLARE_GETT(mode, size) \
140 XCONCAT2 (GETT,mode) (unsigned char *p) \
143 memcpy (&tmp, p, sizeof (mode)); \
144 return XCONCAT2 (T2H_,size) (tmp); \
147 #define DECLARE_GETT(mode, size) \
148 extern mode XCONCAT2 (GETT,mode) (unsigned char *);
152 DECLARE_GETT (UQI
, 1)
154 DECLARE_GETT (UHI
, 2)
156 DECLARE_GETT (USI
, 4)
158 DECLARE_GETT (UDI
, 8)
163 DECLARE_GETT (TF, 16)
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). */
172 #if defined (__GNUC__) || defined (MEMOPS_DEFINE_INLINE)
173 #define DECLARE_SETT(mode, size) \
175 XCONCAT2 (SETT,mode) (unsigned char *buf, mode val) \
178 tmp = XCONCAT2 (H2T_,size) (val); \
179 memcpy (buf, &tmp, sizeof (mode)); \
182 #define DECLARE_SETT(mode, size) \
183 extern mode XCONCAT2 (GETT,mode) (unsigned char *, mode);
187 DECLARE_SETT (UQI
, 1)
189 DECLARE_SETT (UHI
, 2)
191 DECLARE_SETT (USI
, 4)
193 DECLARE_SETT (UDI
, 8)
198 DECLARE_SETT (TF, 16)
203 #endif /* CGEN_MEM_H */