X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=sim%2Fcommon%2Fcgen-mem.h;h=ea8e0cc435fb10e6ac3d893119c01338d4fe03fd;hb=3a67e1a6b4430374f3073e51bb19347d4c421cfe;hp=c91ccb3f688b978bf24b977645edeec635051d49;hpb=8b0b198558d0fc981f129e2e3dcbe00a0f308449;p=deliverable%2Fbinutils-gdb.git diff --git a/sim/common/cgen-mem.h b/sim/common/cgen-mem.h index c91ccb3f68..ea8e0cc435 100644 --- a/sim/common/cgen-mem.h +++ b/sim/common/cgen-mem.h @@ -1,58 +1,37 @@ /* Memory ops header for CGEN-based simulators. - Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc. + Copyright (C) 1996-2018 Free Software Foundation, Inc. Contributed by Cygnus Solutions. This file is part of the GNU Simulators. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2, or (at your option) -any later version. +the Free Software Foundation; either version 3 of the License, or +(at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -You should have received a copy of the GNU General Public License along -with this program; if not, write to the Free Software Foundation, Inc., -59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +You should have received a copy of the GNU General Public License +along with this program. If not, see . */ #ifndef CGEN_MEM_H #define CGEN_MEM_H +/* TODO: This should get moved into sim-inline.h. */ #ifdef MEMOPS_DEFINE_INLINE #define MEMOPS_INLINE #else -#define MEMOPS_INLINE extern inline +#define MEMOPS_INLINE EXTERN_INLINE #endif -/* Memory read support. */ +/* Integer memory read support. -#if defined (__GNUC__) || defined (MEMOPS_DEFINE_INLINE) -#define DECLARE_GETMEM(mode, size) \ -MEMOPS_INLINE mode \ -XCONCAT2 (GETMEM,mode) (SIM_CPU *cpu, IADDR pc, ADDR a) \ -{ \ - PROFILE_COUNT_READ (cpu, a, XCONCAT2 (MODE_,mode)); \ - /* Don't read anything into "unaligned" here. Bad name choice. */\ - return XCONCAT2 (sim_core_read_unaligned_,size) (cpu, pc, read_map, a); \ -} -#else -#define DECLARE_GETMEM(mode, size) \ -extern mode XCONCAT2 (GETMEM,mode) (SIM_CPU *, IADDR, ADDR); -#endif - -DECLARE_GETMEM (QI, 1) -DECLARE_GETMEM (UQI, 1) -DECLARE_GETMEM (HI, 2) -DECLARE_GETMEM (UHI, 2) -DECLARE_GETMEM (SI, 4) -DECLARE_GETMEM (USI, 4) -DECLARE_GETMEM (DI, 8) -DECLARE_GETMEM (UDI, 8) - -#undef DECLARE_GETMEM + There is no floating point support. In this context there are no + floating point modes, only floating point operations (whose arguments + and results are arrays of bits that we treat as integer modes). */ #if defined (__GNUC__) || defined (MEMOPS_DEFINE_INLINE) #define DECLARE_GETMEM(mode, size) \ @@ -68,13 +47,18 @@ XCONCAT2 (GETMEM,mode) (SIM_CPU *cpu, IADDR pc, ADDR a) \ extern mode XCONCAT2 (GETMEM,mode) (SIM_CPU *, IADDR, ADDR); #endif -DECLARE_GETMEM (SF, 4) -DECLARE_GETMEM (DF, 8) -/*DECLARE_GETMEM (TF, 16)*/ +DECLARE_GETMEM (QI, 1) /* TAGS: GETMEMQI */ +DECLARE_GETMEM (UQI, 1) /* TAGS: GETMEMUQI */ +DECLARE_GETMEM (HI, 2) /* TAGS: GETMEMHI */ +DECLARE_GETMEM (UHI, 2) /* TAGS: GETMEMUHI */ +DECLARE_GETMEM (SI, 4) /* TAGS: GETMEMSI */ +DECLARE_GETMEM (USI, 4) /* TAGS: GETMEMUSI */ +DECLARE_GETMEM (DI, 8) /* TAGS: GETMEMDI */ +DECLARE_GETMEM (UDI, 8) /* TAGS: GETMEMUDI */ #undef DECLARE_GETMEM -/* Memory write support. */ +/* Integer memory write support. */ #if defined (__GNUC__) || defined (MEMOPS_DEFINE_INLINE) #define DECLARE_SETMEM(mode, size) \ @@ -90,20 +74,14 @@ XCONCAT2 (SETMEM,mode) (SIM_CPU *cpu, IADDR pc, ADDR a, mode val) \ extern void XCONCAT2 (SETMEM,mode) (SIM_CPU *, IADDR, ADDR, mode); #endif -DECLARE_SETMEM (QI, 1) -DECLARE_SETMEM (UQI, 1) -DECLARE_SETMEM (HI, 2) -DECLARE_SETMEM (UHI, 2) -DECLARE_SETMEM (SI, 4) -DECLARE_SETMEM (USI, 4) -DECLARE_SETMEM (DI, 8) -DECLARE_SETMEM (UDI, 8) - -/* -DECLARE_SETMEM (SF, 4) -DECLARE_SETMEM (DF, 8) -DECLARE_SETMEM (TF, 16) -*/ +DECLARE_SETMEM (QI, 1) /* TAGS: SETMEMQI */ +DECLARE_SETMEM (UQI, 1) /* TAGS: SETMEMUQI */ +DECLARE_SETMEM (HI, 2) /* TAGS: SETMEMHI */ +DECLARE_SETMEM (UHI, 2) /* TAGS: SETMEMUHI */ +DECLARE_SETMEM (SI, 4) /* TAGS: SETMEMSI */ +DECLARE_SETMEM (USI, 4) /* TAGS: SETMEMUSI */ +DECLARE_SETMEM (DI, 8) /* TAGS: SETMEMDI */ +DECLARE_SETMEM (UDI, 8) /* TAGS: SETMEMUDI */ #undef DECLARE_SETMEM @@ -123,20 +101,68 @@ XCONCAT2 (GETIMEM,mode) (SIM_CPU *cpu, IADDR a) \ extern mode XCONCAT2 (GETIMEM,mode) (SIM_CPU *, ADDR); #endif -DECLARE_GETIMEM (UQI, 1) -DECLARE_GETIMEM (UHI, 2) -DECLARE_GETIMEM (USI, 4) -DECLARE_GETIMEM (UDI, 8) +DECLARE_GETIMEM (UQI, 1) /* TAGS: GETIMEMUQI */ +DECLARE_GETIMEM (UHI, 2) /* TAGS: GETIMEMUHI */ +DECLARE_GETIMEM (USI, 4) /* TAGS: GETIMEMUSI */ +DECLARE_GETIMEM (UDI, 8) /* TAGS: GETIMEMUDI */ #undef DECLARE_GETIMEM +/* Floating point support. + + ??? One can specify that the integer memory ops should be used instead, + and treat fp values as just a series of bits. One might even bubble + that notion up into the description language. However, that departs from + gcc. One could cross over from gcc's notion and a "series of bits" notion + between there and here, and thus still not require these routines. However, + that's a complication of its own (not that having these fns isn't). + But for now, we do things this way. */ + +#if defined (__GNUC__) || defined (MEMOPS_DEFINE_INLINE) +#define DECLARE_GETMEM(mode, size) \ +MEMOPS_INLINE mode \ +XCONCAT2 (GETMEM,mode) (SIM_CPU *cpu, IADDR pc, ADDR a) \ +{ \ + PROFILE_COUNT_READ (cpu, a, XCONCAT2 (MODE_,mode)); \ + /* Don't read anything into "unaligned" here. Bad name choice. */\ + return XCONCAT2 (sim_core_read_unaligned_,size) (cpu, pc, read_map, a); \ +} +#else +#define DECLARE_GETMEM(mode, size) \ +extern mode XCONCAT2 (GETMEM,mode) (SIM_CPU *, IADDR, ADDR); +#endif + +DECLARE_GETMEM (SF, 4) /* TAGS: GETMEMSF */ +DECLARE_GETMEM (DF, 8) /* TAGS: GETMEMDF */ + +#undef DECLARE_GETMEM + +#if defined (__GNUC__) || defined (MEMOPS_DEFINE_INLINE) +#define DECLARE_SETMEM(mode, size) \ +MEMOPS_INLINE void \ +XCONCAT2 (SETMEM,mode) (SIM_CPU *cpu, IADDR pc, ADDR a, mode val) \ +{ \ + PROFILE_COUNT_WRITE (cpu, a, XCONCAT2 (MODE_,mode)); \ + /* Don't read anything into "unaligned" here. Bad name choice. */ \ + XCONCAT2 (sim_core_write_unaligned_,size) (cpu, pc, write_map, a, val); \ +} +#else +#define DECLARE_SETMEM(mode, size) \ +extern void XCONCAT2 (SETMEM,mode) (SIM_CPU *, IADDR, ADDR, mode); +#endif + +DECLARE_SETMEM (SF, 4) /* TAGS: SETMEMSF */ +DECLARE_SETMEM (DF, 8) /* TAGS: SETMEMDF */ + +#undef DECLARE_SETMEM + /* GETT: translate target value at P to host value. This needn't be very efficient (i.e. can call memcpy) as this is only used when interfacing with the outside world (e.g. gdb). */ -#if defined (__GNUC__) || defined (MEMOPS_DEFINE_INLINE) +#if defined (MEMOPS_DEFINE_INLINE) #define DECLARE_GETT(mode, size) \ -MEMOPS_INLINE mode \ +mode \ XCONCAT2 (GETT,mode) (unsigned char *p) \ { \ mode tmp; \ @@ -148,20 +174,20 @@ XCONCAT2 (GETT,mode) (unsigned char *p) \ extern mode XCONCAT2 (GETT,mode) (unsigned char *); #endif -DECLARE_GETT (QI, 1) -DECLARE_GETT (UQI, 1) -DECLARE_GETT (HI, 2) -DECLARE_GETT (UHI, 2) -DECLARE_GETT (SI, 4) -DECLARE_GETT (USI, 4) -DECLARE_GETT (DI, 8) -DECLARE_GETT (UDI, 8) - -/* -DECLARE_GETT (SF, 4) -DECLARE_GETT (DF, 8) -DECLARE_GETT (TF, 16) -*/ +DECLARE_GETT (QI, 1) /* TAGS: GETTQI */ +DECLARE_GETT (UQI, 1) /* TAGS: GETTUQI */ +DECLARE_GETT (HI, 2) /* TAGS: GETTHI */ +DECLARE_GETT (UHI, 2) /* TAGS: GETTUHI */ +DECLARE_GETT (SI, 4) /* TAGS: GETTSI */ +DECLARE_GETT (USI, 4) /* TAGS: GETTUSI */ +DECLARE_GETT (DI, 8) /* TAGS: GETTDI */ +DECLARE_GETT (UDI, 8) /* TAGS: GETTUDI */ + +#if 0 /* ??? defered until necessary */ +DECLARE_GETT (SF, 4) /* TAGS: GETTSF */ +DECLARE_GETT (DF, 8) /* TAGS: GETTDF */ +DECLARE_GETT (TF, 16) /* TAGS: GETTTF */ +#endif #undef DECLARE_GETT @@ -169,9 +195,9 @@ DECLARE_GETT (TF, 16) This needn't be very efficient (i.e. can call memcpy) as this is only used when interfacing with the outside world (e.g. gdb). */ -#if defined (__GNUC__) || defined (MEMOPS_DEFINE_INLINE) +#if defined (MEMOPS_DEFINE_INLINE) #define DECLARE_SETT(mode, size) \ -MEMOPS_INLINE void \ +void \ XCONCAT2 (SETT,mode) (unsigned char *buf, mode val) \ { \ mode tmp; \ @@ -180,23 +206,23 @@ XCONCAT2 (SETT,mode) (unsigned char *buf, mode val) \ } #else #define DECLARE_SETT(mode, size) \ -extern mode XCONCAT2 (GETT,mode) (unsigned char *, mode); +extern mode XCONCAT2 (SETT,mode) (unsigned char *, mode); #endif -DECLARE_SETT (QI, 1) -DECLARE_SETT (UQI, 1) -DECLARE_SETT (HI, 2) -DECLARE_SETT (UHI, 2) -DECLARE_SETT (SI, 4) -DECLARE_SETT (USI, 4) -DECLARE_SETT (DI, 8) -DECLARE_SETT (UDI, 8) - -/* -DECLARE_SETT (SF, 4) -DECLARE_SETT (DF, 8) -DECLARE_SETT (TF, 16) -*/ +DECLARE_SETT (QI, 1) /* TAGS: SETTQI */ +DECLARE_SETT (UQI, 1) /* TAGS: SETTUQI */ +DECLARE_SETT (HI, 2) /* TAGS: SETTHI */ +DECLARE_SETT (UHI, 2) /* TAGS: SETTUHI */ +DECLARE_SETT (SI, 4) /* TAGS: SETTSI */ +DECLARE_SETT (USI, 4) /* TAGS: SETTUSI */ +DECLARE_SETT (DI, 8) /* TAGS: SETTDI */ +DECLARE_SETT (UDI, 8) /* TAGS: SETTUDI */ + +#if 0 /* ??? defered until necessary */ +DECLARE_SETT (SF, 4) /* TAGS: SETTSF */ +DECLARE_SETT (DF, 8) /* TAGS: SETTDF */ +DECLARE_SETT (TF, 16) /* TAGS: SETTTF */ +#endif #undef DECLARE_SETT