]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blobdiff - sim/common/cgen-engine.h
GDB copyright headers update after running GDB's copyright.py script.
[thirdparty/binutils-gdb.git] / sim / common / cgen-engine.h
index d24943c98c32ee92ed1012eb34cb7794ba340b24..d57769e42f785472fd75d00e5bebd57d70df22b6 100644 (file)
@@ -1,5 +1,5 @@
 /* Engine header for Cpu tools GENerated simulators.
-   Copyright (C) 1998, 1999, 2007, 2008 Free Software Foundation, Inc.
+   Copyright (C) 1998-2016 Free Software Foundation, Inc.
    Contributed by Cygnus Support.
 
 This file is part of GDB, the GNU debugger.
@@ -17,9 +17,11 @@ 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, see <http://www.gnu.org/licenses/>.  */
 
-/* This file must be included after eng.h and before ${cpu}.h.
+/* This file is included by ${cpu}.h.
+   It needs CGEN_INSN_WORD which is defined by ${cpu}.h.
    ??? A lot of this could be moved to genmloop.sh to be put in eng.h
-   and thus remove some conditional compilation.  Worth it?  */
+   and thus remove some conditional compilation.  We'd still need
+   CGEN_INSN_WORD though.  */
 
 /* Semantic functions come in six versions on two axes:
    fast/full-featured, and using one of the simple/scache/compilation engines.
@@ -49,25 +51,39 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
 /* Instruction field support macros.  */
 
-#define EXTRACT_MSB0_INT(val, total, start, length) \
+#define EXTRACT_MSB0_SINT(val, total, start, length) \
 (((INT) (val) << ((sizeof (INT) * 8) - (total) + (start))) \
  >> ((sizeof (INT) * 8) - (length)))
 #define EXTRACT_MSB0_UINT(val, total, start, length) \
 (((UINT) (val) << ((sizeof (UINT) * 8) - (total) + (start))) \
  >> ((sizeof (UINT) * 8) - (length)))
 
-#define EXTRACT_LSB0_INT(val, total, start, length) \
+#define EXTRACT_LSB0_SINT(val, total, start, length) \
 (((INT) (val) << ((sizeof (INT) * 8) - (start) - 1)) \
  >> ((sizeof (INT) * 8) - (length)))
 #define EXTRACT_LSB0_UINT(val, total, start, length) \
 (((UINT) (val) << ((sizeof (UINT) * 8) - (start) - 1)) \
  >> ((sizeof (UINT) * 8) - (length)))
+
+#define EXTRACT_MSB0_LGSINT(val, total, start, length) \
+(((CGEN_INSN_LGSINT) (val) << ((sizeof (CGEN_INSN_LGSINT) * 8) - (total) + (start))) \
+ >> ((sizeof (CGEN_INSN_LGSINT) * 8) - (length)))
+#define EXTRACT_MSB0_LGUINT(val, total, start, length) \
+(((CGEN_INSN_UINT) (val) << ((sizeof (CGEN_INSN_LGUINT) * 8) - (total) + (start))) \
+ >> ((sizeof (CGEN_INSN_LGUINT) * 8) - (length)))
+
+#define EXTRACT_LSB0_LGSINT(val, total, start, length) \
+(((CGEN_INSN_LGSINT) (val) << ((sizeof (CGEN_INSN_LGSINT) * 8) - (start) - 1)) \
+ >> ((sizeof (CGEN_INSN_LGSINT) * 8) - (length)))
+#define EXTRACT_LSB0_LGUINT(val, total, start, length) \
+(((CGEN_INSN_LGUINT) (val) << ((sizeof (CGEN_INSN_LGUINT) * 8) - (start) - 1)) \
+ >> ((sizeof (CGEN_INSN_LGUINT) * 8) - (length)))
 \f
 /* Semantic routines.  */
 
 /* Type of the machine generated extraction fns.  */
 /* ??? No longer used.  */
-typedef void (EXTRACT_FN) (SIM_CPU *, IADDR, CGEN_INSN_INT, ARGBUF *);
+typedef void (EXTRACT_FN) (SIM_CPU *, IADDR, CGEN_INSN_WORD, ARGBUF *);
 
 /* Type of the machine generated semantic fns.  */
 
@@ -89,9 +105,9 @@ typedef unsigned int SEM_STATUS;
 /* Instruction fields are extracted by the semantic routine.
    ??? TODO: multi word insns.  */
 #if HAVE_PARALLEL_INSNS && ! WITH_PARALLEL_GENWRITE
-typedef SEM_STATUS (SEMANTIC_FN) (SIM_CPU *, SEM_ARG, PAREXEC *, CGEN_INSN_INT);
+typedef SEM_STATUS (SEMANTIC_FN) (SIM_CPU *, SEM_ARG, PAREXEC *, CGEN_INSN_WORD);
 #else
-typedef SEM_STATUS (SEMANTIC_FN) (SIM_CPU *, SEM_ARG, CGEN_INSN_INT);
+typedef SEM_STATUS (SEMANTIC_FN) (SIM_CPU *, SEM_ARG, CGEN_INSN_WORD);
 #endif
 
 #endif
@@ -120,7 +136,7 @@ union sem {
 #ifdef __GNUC__
 #define SEM_SET_FULL_CODE(abuf, idesc) \
   do { (abuf)->semantic.sem_case = (idesc)->sem_full_lab; } while (0)
-#else 
+#else
 #define SEM_SET_FULL_CODE(abuf, idesc) \
   do { (abuf)->semantic.sem_case = (idesc)->num; } while (0)
 #endif
@@ -133,7 +149,7 @@ union sem {
 #ifdef __GNUC__
 #define SEM_SET_FAST_CODE(abuf, idesc) \
   do { (abuf)->semantic.sem_case = (idesc)->sem_fast_lab; } while (0)
-#else 
+#else
 #define SEM_SET_FAST_CODE(abuf, idesc) \
   do { (abuf)->semantic.sem_case = (idesc)->num; } while (0)
 #endif
@@ -168,22 +184,8 @@ do { \
 /* Return pointer to ARGBUF given ptr to SCACHE.  */
 #define SEM_ARGBUF(sem_arg) (& (sem_arg) -> argbuf)
 
-/* There are several styles of engines, all generally supported by the
-   same code:
-
-   WITH_SCACHE && WITH_SCACHE_PBB - pseudo-basic-block scaching
-   WITH_SCACHE && !WITH_SCACHE_PBB - scaching on an insn by insn basis
-   !WITH_SCACHE - simple engine: fetch an insn, execute an insn
-
-   ??? The !WITH_SCACHE case can also be broken up into two flavours:
-   extract the fields of the insn into an ARGBUF struct, or defer the
-   extraction to the semantic handler.  The WITH_SCACHE case always
-   extracts the fields into an ARGBUF struct.  */
-
 #if WITH_SCACHE
 
-#define CIA_ADDR(cia) (cia)
-
 #if WITH_SCACHE_PBB
 
 /* Return the scache pointer of the current insn.  */
@@ -276,8 +278,6 @@ do { \
 
 /* This is the "simple" engine case.  */
 
-#define CIA_ADDR(cia) (cia)
-
 #define SEM_SEM_ARG(vpc, sc) (sc)
 
 #define SEM_NEXT_VPC(sem_arg, pc, len) ((pc) + (len))