]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - sim/common/cgen-mem.h
* config/sh/tm-sh.h (BELIEVE_PCC_PROMOTION): Define, so that
[thirdparty/binutils-gdb.git] / sim / common / cgen-mem.h
CommitLineData
b9c8cd10 1/* Memory ops header for CGEN-based simlators.
36dbc8bb
DE
2 Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
3 Contributed by Cygnus Solutions.
b9c8cd10 4
36dbc8bb 5This file is part of the GNU Simulators.
b9c8cd10
DE
6
7This program is free software; you can redistribute it and/or modify
8it under the terms of the GNU General Public License as published by
9the Free Software Foundation; either version 2, or (at your option)
10any later version.
11
12This program is distributed in the hope that it will be useful,
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License along
18with this program; if not, write to the Free Software Foundation, Inc.,
36dbc8bb 1959 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
b9c8cd10
DE
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
b9c8cd10 30#if defined (__GNUC__) || defined (MEMOPS_DEFINE_INLINE)
36dbc8bb
DE
31#define DECLARE_GETMEM(mode, size) \
32MEMOPS_INLINE mode \
33XCONCAT2 (GETMEM,mode) (SIM_CPU *cpu, ADDR a) \
34{ \
35 PROFILE_COUNT_READ (cpu, a, XCONCAT2 (MODE_,mode)); \
36 /* Don't read anything into "unaligned" here. Bad name choice. */\
37 return XCONCAT2 (sim_core_read_unaligned_,size) (cpu, NULL_CIA, sim_core_read_map, a); \
b9c8cd10
DE
38}
39#else
36dbc8bb
DE
40#define DECLARE_GETMEM(mode, size) \
41extern mode XCONCAT2 (GETMEM,mode) (SIM_CPU *, ADDR);
b9c8cd10
DE
42#endif
43
36dbc8bb
DE
44DECLARE_GETMEM (QI, 1)
45DECLARE_GETMEM (UQI, 1)
46DECLARE_GETMEM (HI, 2)
47DECLARE_GETMEM (UHI, 2)
48DECLARE_GETMEM (SI, 4)
49DECLARE_GETMEM (USI, 4)
50DECLARE_GETMEM (DI, 8)
51DECLARE_GETMEM (UDI, 8)
b9c8cd10 52
36dbc8bb 53#undef DECLARE_GETMEM
b9c8cd10
DE
54
55#if defined (__GNUC__) || defined (MEMOPS_DEFINE_INLINE)
36dbc8bb
DE
56#define DECLARE_SETMEM(mode, size) \
57MEMOPS_INLINE void \
58XCONCAT2 (SETMEM,mode) (SIM_CPU *cpu, ADDR a, mode val) \
59{ \
60 PROFILE_COUNT_WRITE (cpu, a, XCONCAT2 (MODE_,mode)); \
61 /* Don't read anything into "unaligned" here. Bad name choice. */ \
62 XCONCAT2 (sim_core_write_unaligned_,size) (cpu, NULL_CIA, sim_core_write_map, a, val); \
b9c8cd10
DE
63}
64#else
36dbc8bb
DE
65#define DECLARE_SETMEM(mode, size) \
66extern void XCONCAT2 (SETMEM,mode) (SIM_CPU *, ADDR, mode);
b9c8cd10
DE
67#endif
68
36dbc8bb
DE
69DECLARE_SETMEM (QI, 1)
70DECLARE_SETMEM (UQI, 1)
71DECLARE_SETMEM (HI, 2)
72DECLARE_SETMEM (UHI, 2)
73DECLARE_SETMEM (SI, 4)
74DECLARE_SETMEM (USI, 4)
75DECLARE_SETMEM (DI, 8)
76DECLARE_SETMEM (UDI, 8)
b9c8cd10 77
36dbc8bb 78#undef DECLARE_SETMEM
b9c8cd10
DE
79
80#if defined (__GNUC__) || defined (MEMOPS_DEFINE_INLINE)
36dbc8bb
DE
81#define DECLARE_GETIMEM(mode, size) \
82MEMOPS_INLINE mode \
83XCONCAT2 (GETIMEM,mode) (SIM_CPU *cpu, ADDR a) \
84{ \
85 /*PROFILE_COUNT_READ (cpu, a, XCONCAT2 (MODE_,mode));*/ \
86 /* Don't read anything into "unaligned" here. Bad name choice. */\
87 return XCONCAT2 (sim_core_read_unaligned_,size) (cpu, NULL_CIA, sim_core_execute_map, a); \
b9c8cd10
DE
88}
89#else
36dbc8bb
DE
90#define DECLARE_GETIMEM(mode, size) \
91extern mode XCONCAT2 (GETIMEM,mode) (SIM_CPU *, ADDR);
b9c8cd10
DE
92#endif
93
36dbc8bb
DE
94DECLARE_GETIMEM (UQI, 1)
95DECLARE_GETIMEM (UHI, 2)
96DECLARE_GETIMEM (USI, 4)
97DECLARE_GETIMEM (UDI, 8)
b9c8cd10 98
36dbc8bb 99#undef DECLARE_GETIMEM
b9c8cd10 100
36dbc8bb
DE
101/* GETT<mode>: translate target value at P to host value.
102 ??? How inefficient is the current implementation? */
b9c8cd10
DE
103
104#if defined (__GNUC__) || defined (MEMOPS_DEFINE_INLINE)
36dbc8bb
DE
105#define DECLARE_GETT(mode, size) \
106MEMOPS_INLINE mode \
107XCONCAT2 (GETT,mode) (unsigned char *p) \
108{ \
109 mode tmp; \
110 memcpy (&tmp, p, sizeof (mode)); \
111 return XCONCAT2 (T2H_,size) (tmp); \
b9c8cd10
DE
112}
113#else
36dbc8bb
DE
114#define DECLARE_GETT(mode, size) \
115extern mode XCONCAT2 (GETT,mode) (unsigned char *);
b9c8cd10
DE
116#endif
117
36dbc8bb
DE
118DECLARE_GETT (QI, 1)
119DECLARE_GETT (UQI, 1)
120DECLARE_GETT (HI, 2)
121DECLARE_GETT (UHI, 2)
122DECLARE_GETT (SI, 4)
123DECLARE_GETT (USI, 4)
124DECLARE_GETT (DI, 8)
125DECLARE_GETT (UDI, 8)
b9c8cd10 126
36dbc8bb 127#undef DECLARE_GETT
b9c8cd10 128
36dbc8bb
DE
129/* SETT<mode>: translate host value to target value and store at P.
130 ??? How inefficient is the current implementation? */
b9c8cd10
DE
131
132#if defined (__GNUC__) || defined (MEMOPS_DEFINE_INLINE)
36dbc8bb
DE
133#define DECLARE_SETT(mode, size) \
134MEMOPS_INLINE mode \
135XCONCAT2 (SETT,mode) (unsigned char *buf, mode val) \
136{ \
137 mode tmp; \
138 tmp = XCONCAT2 (H2T_,size) (val); \
139 memcpy (buf, &tmp, sizeof (mode)); \
b9c8cd10
DE
140}
141#else
36dbc8bb
DE
142#define DECLARE_SETT(mode, size) \
143extern mode XCONCAT2 (GETT,mode) (unsigned char *, mode);
b9c8cd10
DE
144#endif
145
36dbc8bb
DE
146DECLARE_SETT (QI, 1)
147DECLARE_SETT (UQI, 1)
148DECLARE_SETT (HI, 2)
149DECLARE_SETT (UHI, 2)
150DECLARE_SETT (SI, 4)
151DECLARE_SETT (USI, 4)
152DECLARE_SETT (DI, 8)
153DECLARE_SETT (UDI, 8)
b9c8cd10 154
36dbc8bb 155#undef DECLARE_SETT
b9c8cd10 156
36dbc8bb 157#endif /* CGEN_MEM_H */