]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
Tons of changes to allow model specific information in the instruction file.
authorMichael Meissner <gnu@the-meissners.org>
Fri, 10 Nov 1995 22:49:05 +0000 (22:49 +0000)
committerMichael Meissner <gnu@the-meissners.org>
Fri, 10 Nov 1995 22:49:05 +0000 (22:49 +0000)
sim/ppc/ChangeLog
sim/ppc/configure
sim/ppc/configure.in
sim/ppc/igen.c
sim/ppc/inline.h
sim/ppc/options.c

index 1447655ffabd1d9668887633c1611fb75e5b8d0e..90d69c69ec08972ef08e04f98867d8baf3acdf6d 100644 (file)
@@ -1,10 +1,58 @@
 Fri Nov 10 06:39:46 1995  Michael Meissner  <meissner@tiktok.cygnus.com>
 
+       * table.c (table): New field nr_model_fields.
+       (table_open): New parameter nr_model_fields.
+       (table_entry_read): Parse model fields that begin with a '*' after
+       each instruction.
+       * igen.c, dgen.c: Change callers of table_open.
+
+       * igen.c: Add support for dumping model specific information in
+       model.h and model.c.
+       (insn_field_name): Delete unused array.
+       (global variables): Make global variables static, so we can tell
+       when they are no longer used.
+       (cache_semantic_actual): Delete unused variable.
+       (insn_table_load_insns): If the insn is really a machine model,
+       call model_table_insert instead of other processing.
+       (model_table_insert): New function to handle defining the
+       functional units of a particular machine model.
+       (insn_table): Add last_function field so we can add functions at
+       the end.
+       (insn_table_insert_function): Use last_function field when
+       appending new function.
+
+       * ppc-instructions: Add a few model specific information for 603,
+       603e, and 604 for testing purposes.
+       
+       * table.h (table_model_entry): New linked list to hold model
+       specific information, one per line.
+       (table_entry): Add model_first, model_last fields.
+
        * configure.in (--enable-sim-inline): If gcc is found and
        --enable-sim-inline is not specified, defaine DEFAULT_INLINE to 1,
        not 2.
+       (--enable-sim-reserved-bits): New switch to check whether reserved
+       bits are set in the instruction.
+       (--enable-sim-opcode): Make complex the default.
+       (all switches): Add appropriate checks and error messages.
        * configure: Regenerate.
 
+       * Makefile.in (RESERVED_CFLAGS): New variable set by
+       --enable-sim-reserved-bits.
+       (CONFIG_CFLAGS): Include RESERVED_CFLAGS.
+       (BUILT_SRC): igen now generates model.c and model.h.
+       (LIB_OBJ): Include table.o.
+       (tmp-igen): Add -m/-M options to write model.c/model.h.
+       (model.o): New object.
+       (CPU_H): Include model.h.
+
+       * cpu.h: Include model.h.
+
+       * std-config.h (WITH_RESERVED_BITS): Define.
+       (MODEL_INLINE): Ditto.
+
+       * options.c (print_options): Print out WITH_RESERVED_BITS.
+
 Thu Nov  9 12:22:15 1995  Michael Meissner  <meissner@tiktok.cygnus.com>
 
        * configure.in: If --silent, don't output information messages.
index 841c6a3fda4a1166381ec0a72edd5458e02882a3..aaa176b777d40bb2c9aca1daa4dd2b5e07cf1cd7 100755 (executable)
@@ -40,7 +40,7 @@ ac_help="$ac_help
 ac_help="$ac_help
   --enable-sim-bitsize=n               Specify target bitsize (32 or 64)."
 ac_help="$ac_help
-  --enable-sim-hostbitsize=n           Specify host bitsize (32 or 64)."
+  --enable-sim-hostbitsize=32|64       Specify host bitsize (32 or 64)."
 ac_help="$ac_help
   --enable-sim-env=env                 Specify target environment (operating, virtual, user)."
 ac_help="$ac_help
@@ -51,6 +51,8 @@ ac_help="$ac_help
   --enable-sim-trace                   Specify whether tracing is supported."
 ac_help="$ac_help
   --enable-sim-assert                  Specify whether to perform random assertions."
+ac_help="$ac_help
+  --enable-sim-reserved-bits           Specify whether to check reserved bits in instruction."
 ac_help="$ac_help
   --enable-sim-float                   Specify whether to use host floating point or simulate."
 ac_help="$ac_help
@@ -483,30 +485,48 @@ fi
 enableval="$enable_sim_config"
 if test -n "$enableval"; then
   case "${enableval}" in
-  yes) sim_config="std-config.h";;
-  no)  sim_config="std-config.h";;
-  *)   sim_config="${enableval}";;
+  yes|no)      { echo "configure: error: "No value supplied for --enable-sim-config=file"" 1>&2; exit 1; };;
+  *)           if test -f "${enableval}"; then
+                 sim_config="${enableval}";
+               elif test -f "${enableval}-config.h"; then
+                 sim_config="${enableval}-config.h"
+               else
+                 { echo "configure: error: "Config file $enableval was not found"" 1>&2; exit 1; };
+                 sim_config=std-config.h
+               fi;;
 esac
 if test x"$silent" != x"yes" && test x"$sim_config" != x""; then
   echo "Setting config flags = $sim_config" 6>&1
 fi
 else
-  sim_config="std-config.h"; echo "Setting config flags = $sim_config" 6>&1
+  sim_config="std-config.h"
+if test x"$silent" != x"yes"; then
+  echo "Setting config flags = $sim_config" 6>&1
+fi
 fi
 
 # Check whether --enable-sim-opcode or --disable-sim-opcode was given.
 enableval="$enable_sim_opcode"
 if test -n "$enableval"; then
   case "${enableval}" in
-  yes) sim_opcode="ppc-opcode-simple";;
-  no)  sim_opcode="ppc-opcode-simple";;
-  *)   sim_opcode="ppc-opcode-${enableval}";;
+  yes|no)      { echo "configure: error: "No value supplied for --enable-sim-opcode=file"" 1>&2; exit 1; };;
+  *)           if test -f "${enableval}"; then
+                 sim_opcode="${enableval}"
+               elif test -f "ppc-opcode-${enableval}"; then
+                 sim_opcode="ppc-opcode-${enableval}"
+               else
+                 { echo "configure: error: "File $enableval is not an opcode rules file"" 1>&2; exit 1; };
+                 sim_opcode="ppc-opcode-complex"
+               fi;;
 esac
 if test x"$silent" != x"yes" && test x"$sim_opcode" != x""; then
   echo "Setting opcode flags = $sim_opcode" 6>&1
 fi
 else
-  sim_opcode="ppc-opcode-simple"; echo "Setting opcode flags = $sim_opcode"
+  sim_opcode="ppc-opcode-complex"
+if test x"$silent" != x"yes"; then
+  echo "Setting opcode flags = $sim_opcode"
+fi
 fi
 
 # Check whether --enable-sim-switch or --disable-sim-switch was given.
@@ -514,7 +534,8 @@ enableval="$enable_sim_switch"
 if test -n "$enableval"; then
   case "${enableval}" in
   yes) sim_switch="-s";;
-  *)   sim_switch="";;
+  no)  sim_switch="";;
+  *)   { echo "configure: error: "--enable-sim-switch does not take a value"" 1>&2; exit 1; }; sim_switch="";;
 esac
 if test x"$silent" != x"yes" && test x"$sim_switch" != x""; then
   echo "Setting switch flags = $sim_switch" 6>&1
@@ -530,8 +551,9 @@ fi
 enableval="$enable_sim_duplicate"
 if test -n "$enableval"; then
   case "${enableval}" in
-   yes)        sim_dup="-e";;
-   *)  sim_dup="";;
+  yes) sim_dup="-e";;
+  no)  sim_dup="";;
+  *)   { echo "configure: error: "--enable-sim-duplicate does not take a value"" 1>&2; exit 1; }; sim_dup="";;
 esac
 if test x"$silent" != x"yes" && test x"$sim_dup" != x""; then
   echo "Setting duplicate flags = $sim_dup" 6>&1
@@ -547,8 +569,9 @@ fi
 enableval="$enable_sim_filter"
 if test -n "$enableval"; then
   case "${enableval}" in
-   yes)        sim_filter="";;
-   *)  sim_filter="-f $enableval";;
+  yes) { echo "configure: error: "--enable-sim-filter must be specified with a rule to filter or no"" 1>&2; exit 1; }; sim_filter="";;
+  no)  sim_filter="";;
+  *)   sim_filter="-f $enableval";;
 esac
 if test x"$silent" != x"yes" && test x"$sim_filter" != x""; then
   echo "Setting filter flags = $sim_filter" 6>&1
@@ -564,11 +587,12 @@ fi
 enableval="$enable_sim_icache"
 if test -n "$enableval"; then
   case "${enableval}" in
-   yes)        sim_icache="-r 1024";;
-   *)  sim_icache="";;
+  yes) sim_icache="-r 1024";;
+  no)  sim_icache="";;
+  *)   sim_icache="-r ${enableval}";;
 esac
 else
-  sim_icache=""
+  sim_icache="-r 1024"
 fi
 
 # Check whether --enable-sim-inline or --disable-sim-inline was given.
@@ -615,7 +639,7 @@ if test -n "$enableval"; then
   case "${enableval}" in
   yes) sim_bswap="-DWITH_BSWAP=1";;
   no)  sim_bswap="-DWITH_BSWAP=0";;
-  *)   sim_bswap="";;
+  *)   { echo "configure: error: "--enable-sim-bswap does not take a value"" 1>&2; exit 1; }; sim_bswap="";;
 esac
 if test x"$silent" != x"yes" && test x"$sim_bswap" != x""; then
   echo "Setting bswap flags = $sim_bswap" 6>&1
@@ -636,7 +660,7 @@ if test -n "$enableval"; then
   no)   sim_endian="-DWITH_TARGET_BYTE_ORDER=0";;
   b*|B*) sim_endian="-DWITH_TARGET_BYTE_ORDER=BIG_ENDIAN";;
   l*|L*) sim_endian="-DWITH_TARGET_BYTE_ORDER=LITTLE_ENDIAN";;
-  *)   sim_endian="";;
+  *)    { echo "configure: error: "Unknown value $enableval for --enable-sim-endian"" 1>&2; exit 1; }; sim_endian="";;
 esac
 if test x"$silent" != x"yes" && test x"$sim_endian" != x""; then
   echo "Setting endian flags = $sim_endian" 6>&1
@@ -652,7 +676,7 @@ if test -n "$enableval"; then
   no)   sim_hostendian="-DWITH_HOST_BYTE_ORDER=0";;
   b*|B*) sim_hostendian="-DWITH_HOST_BYTE_ORDER=BIG_ENDIAN";;
   l*|L*) sim_hostendian="-DWITH_HOST_BYTE_ORDER=LITTLE_ENDIAN";;
-  *)    sim_hostendian="";;
+  *)    { echo "configure: error: "Unknown value $enableval for --enable-sim-hostendian"" 1>&2; exit 1; }; sim_hostendian="";;
 esac
 if test x"$silent" != x"yes" && test x"$sim_hostendian" != x""; then
   echo "Setting hostendian flags = $sim_hostendian" 6>&1
@@ -683,9 +707,8 @@ fi
 enableval="$enable_sim_bitsize"
 if test -n "$enableval"; then
   case "${enableval}" in
-  yes) sim_bitsize="";;
-  no)  sim_bitsize="";;
-  *)   sim_bitsize="-DWITH_TARGET_WORD_BITSIZE=$enableval";;
+  32|64) sim_bitsize="-DWITH_TARGET_WORD_BITSIZE=$enableval";;
+  *)    { echo "configure: error: "--enable-sim-bitsize was given $enableval" 1>&2; exit 1; }; sim_bitsize="";;
 esac
 if test x"$silent" != x"yes" && test x"$sim_bitsize" != x""; then
   echo "Setting bitsize flags = $sim_bitsize" 6>&1
@@ -698,9 +721,8 @@ fi
 enableval="$enable_sim_hostbitsize"
 if test -n "$enableval"; then
   case "${enableval}" in
-  yes) sim_hostbitsize="";;
-  no)  sim_hostbitsize="";;
-  *)   sim_hostbitsize="-DWITH_HOST_WORD_BITSIZE=$enableval";;
+  32|64) sim_hostbitsize="-DWITH_HOST_WORD_BITSIZE=$enableval";;
+  *)    { echo "configure: error: "--enable-sim-hostbitsize was given $enableval" 1>&2; exit 1; }; sim_hostbitsize="";;
 esac
 if test x"$silent" != x"yes" && test x"$sim_hostbitsize" != x""; then
   echo "Setting hostbitsize flags = $sim_hostbitsize" 6>&1
@@ -716,7 +738,8 @@ if test -n "$enableval"; then
   operating | os | oea)        sim_env="-DWITH_ENVIRONMENT=OPERATING_ENVIRONMENT";;
   virtual | vea)       sim_env="-DWITH_ENVIRONMENT=VIRTUAL_ENVIRONMENT";;
   user | uea)          sim_env="-DWITH_ENVIRONMENT=USER_ENVIRONMENT";;
-  *)                   sim_env="";;
+  no)                  sim_env="-DWITH_ENVIRONMENT=0";;
+  *)                   { echo "configure: error: "Unknown value $enableval passed to --enable-sim-env"" 1>&2; exit 1; }; sim_env="";;
 esac
 if test x"$silent" != x"yes" && test x"$sim_env" != x""; then
   echo "Setting env flags = $sim_env" 6>&1
@@ -731,7 +754,7 @@ if test -n "$enableval"; then
   case "${enableval}" in
   yes) sim_timebase="-DWITH_TIME_BASE=1";;
   no)  sim_timebase="-DWITH_TIME_BASE=0";;
-  *)   sim_timebase="";;
+  *)   { echo "configure: error: "--enable-sim-timebase does not take a value"" 1>&2; exit 1; }; sim_timebase="";;
 esac
 if test x"$silent" != x"yes" && test x"$sim_timebase" != x""; then
   echo "Setting timebase flags = $sim_timebase" 6>&1
@@ -746,7 +769,7 @@ if test -n "$enableval"; then
   case "${enableval}" in
   yes | strict | STRICT)       sim_alignment="-DWITH_ALIGNMENT=STRICT_ALIGNMENT";;
   no | nonstrict | NONSTRICT)  sim_alignment="-DWITH_ALIGNMENT=NONSTRICT_ALIGNMENT";;
-  *)                           sim_alignment="-DWITH_ALIGNMENT=$enableval";;
+  *)                           { echo "configure: error: "Unknown value $enableval passed to --enable-sim-alignment"" 1>&2; exit 1; }; sim_alignment="";;
 esac
 if test x"$silent" != x"yes" && test x"$sim_alignment" != x""; then
   echo "Setting alignment flags = $sim_alignment" 6>&1
@@ -761,7 +784,7 @@ if test -n "$enableval"; then
   case "${enableval}" in
   yes) sim_trace="-DWITH_TRACE=1";;
   no)  sim_trace="-DWITH_TRACE=0";;
-  *)   sim_trace="";;
+  *)   { echo "configure: error: "--enable-sim-trace does not take a value"" 1>&2; exit 1; }; sim_trace="";;
 esac
 if test x"$silent" != x"yes" && test x"$sim_trace" != x""; then
   echo "Setting trace flags = $sim_trace" 6>&1
@@ -776,7 +799,7 @@ if test -n "$enableval"; then
   case "${enableval}" in
   yes) sim_assert="-DWITH_ASSERT=1";;
   no)  sim_assert="-DWITH_ASSERT=0";;
-  *)   sim_assert="";;
+  *)   { echo "configure: error: "--enable-sim-assert does not take a value"" 1>&2; exit 1; }; sim_assert="";;
 esac
 if test x"$silent" != x"yes" && test x"$sim_assert" != x""; then
   echo "Setting assert flags = $sim_assert" 6>&1
@@ -785,13 +808,28 @@ else
   sim_assert=""
 fi
 
+# Check whether --enable-sim-reserved-bits or --disable-sim-reserved-bits was given.
+enableval="$enable_sim_reserved_bits"
+if test -n "$enableval"; then
+  case "${enableval}" in
+  yes) sim_reserved="-DWITH_RESERVED_BITS=1";;
+  no)  sim_reserved="-DWITH_RESERVED_BITS=0";;
+  *)   { echo "configure: error: "--enable-sim-reserved-bits does not take a value"" 1>&2; exit 1; }; sim_reserved="";;
+esac
+if test x"$silent" != x"yes" && test x"$sim_reserved" != x""; then
+  echo "Setting reserved flags = $sim_reserved" 6>&1
+fi
+else
+  sim_reserved=""
+fi
+
 # Check whether --enable-sim-float or --disable-sim-float was given.
 enableval="$enable_sim_float"
 if test -n "$enableval"; then
   case "${enableval}" in
   yes | hard)  sim_float="-DWITH_FLOATING_POINT=HARD_FLOATING_POINT";;
   no | soft)   sim_float="-DWITH_FLOATING_POINT=SOFT_FLOATING_POINT";;
-  *)           sim_float="";;
+  *)           { echo "configure: error: "Unknown value $enableval passed to --enable-sim-float"" 1>&2; exit 1; }; sim_float="";;
 esac
 if test x"$silent" != x"yes" && test x"$sim_float" != x""; then
   echo "Setting float flags = $sim_float" 6>&1
@@ -808,7 +846,7 @@ if test -n "$enableval"; then
   no)          sim_mon="-DWITH_MON=0";;
   instruction) sim_mon="-DWITH_MON=MONITOR_INSTRUCTION_ISSUE";;
   memory)      sim_mon="-DWITH_MON=MONITOR_LOAD_STORE_UNIT";;
-  *)           sim_mon="-DWITH_MON='$enableval'";;
+  *)           { echo "configure: error: "Unknown value $enableval passed to --enable-sim-mon"" 1>&2; exit 1; }; sim_env="";;
 esac
 if test x"$silent" != x"yes" && test x"$sim_mon" != x""; then
   echo "Setting monitor flags = $sim_mon" 6>&1
@@ -823,7 +861,7 @@ if test -n "$enableval"; then
   case "${enableval}" in
   yes) sim_func="-DWITH_FUNCTION_UNIT=1";;
   no)  sim_func="-DWITH_FUNCTION_UNIT=0";;
-  *)   sim_func="";;
+  *)   { echo "configure: error: "--enable-sim-function-unit does not take a value"" 1>&2; exit 1; }; sim_func="";;
 esac
 if test x"$silent" != x"yes" && test x"$sim_func" != x""; then
   echo "Setting function-unit flags = $sim_func" 6>&1
@@ -836,9 +874,8 @@ fi
 enableval="$enable_sim_model"
 if test -n "$enableval"; then
   case "${enableval}" in
-  yes) sim_model="";;
-  no)  sim_model="";;
-  *)   sim_model="-DWITH_PPC_MODEL=${enableval}";;
+  yes|no)      { echo "configure: error: "No value supplied for --enable-sim-model=model"" 1>&2; exit 1; };;
+  *)           sim_model="-DWITH_MODEL=${enableval}";;
 esac
 if test x"$silent" != x"yes" && test x"$sim_model" != x""; then
   echo "Setting model flags = $sim_model" 6>&1
@@ -851,9 +888,8 @@ fi
 enableval="$enable_sim_default_model"
 if test -n "$enableval"; then
   case "${enableval}" in
-  yes) sim_default_model="";;
-  no)  sim_default_model="";;
-  *)   sim_default_model="-DWITH_DEFAULT_PPC_MODEL=${enableval}";;
+  yes|no)      { echo "configure: error: "No value supplied for --enable-sim-default-model=model"" 1>&2; exit 1; };;
+  *)           sim_default_model="-DWITH_DEFAULT_MODEL=${enableval}";;
 esac
 if test x"$silent" != x"yes" && test x"$sim_default_model" != x""; then
   echo "Setting default-model flags = $sim_default_model" 6>&1
@@ -1118,6 +1154,7 @@ fi
 
 
 
+
 
 
 for ac_func in getrusage
@@ -1127,7 +1164,7 @@ if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 1131 "configure"
+#line 1168 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func(); below.  */
@@ -1182,7 +1219,7 @@ else
   ac_cv_c_cross=yes
 else
 cat > conftest.$ac_ext <<EOF
-#line 1186 "configure"
+#line 1223 "configure"
 #include "confdefs.h"
 main(){return(0);}
 EOF
@@ -1220,7 +1257,7 @@ else
   # On the NeXT, cc -E runs the code through the compiler's parser,
   # not just through cpp.
   cat > conftest.$ac_ext <<EOF
-#line 1224 "configure"
+#line 1261 "configure"
 #include "confdefs.h"
 #include <assert.h>
 Syntax Error
@@ -1234,7 +1271,7 @@ else
   rm -rf conftest*
   CPP="${CC-cc} -E -traditional-cpp"
   cat > conftest.$ac_ext <<EOF
-#line 1238 "configure"
+#line 1275 "configure"
 #include "confdefs.h"
 #include <assert.h>
 Syntax Error
@@ -1267,7 +1304,7 @@ if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 1271 "configure"
+#line 1308 "configure"
 #include "confdefs.h"
 #include <$ac_hdr>
 EOF
@@ -1438,6 +1475,7 @@ s%@sim_alignment@%$sim_alignment%g
 s%@sim_float@%$sim_float%g
 s%@sim_trace@%$sim_trace%g
 s%@sim_assert@%$sim_assert%g
+s%@sim_reserved@%$sim_reserved%g
 s%@sim_monitor@%$sim_monitor%g
 s%@sim_func@%$sim_func%g
 s%@sim_model@%$sim_model%g
index 470c8c4874959da416f5ae157d9dedf046799657..012e040445b8dd5693e0deb789ab8f984d0954fa 100644 (file)
@@ -27,30 +27,49 @@ fi],[sim_warnings=""])dnl
 AC_ARG_ENABLE(sim-config,
 [  --enable-sim-config=file            Override default config file],
 [case "${enableval}" in
-  yes) sim_config="std-config.h";;
-  no)  sim_config="std-config.h";;
-  *)   sim_config="${enableval}";;
+  yes|no)      AC_MSG_ERROR("No value supplied for --enable-sim-config=file");;
+  *)           if test -f "${enableval}"; then
+                 sim_config="${enableval}";
+               elif test -f "${enableval}-config.h"; then
+                 sim_config="${enableval}-config.h"
+               else
+                 AC_MSG_ERROR("Config file $enableval was not found");
+                 sim_config=std-config.h
+               fi;;
 esac
 if test x"$silent" != x"yes" && test x"$sim_config" != x""; then
   echo "Setting config flags = $sim_config" 6>&1
-fi],[sim_config="std-config.h"; echo "Setting config flags = $sim_config" 6>&1])dnl
+fi],[sim_config="std-config.h"
+if test x"$silent" != x"yes"; then
+  echo "Setting config flags = $sim_config" 6>&1
+fi])dnl
 
 AC_ARG_ENABLE(sim-opcode,
 [  --enable-sim-opcode=which           Override default opcode lookup.],
 [case "${enableval}" in
-  yes) sim_opcode="ppc-opcode-simple";;
-  no)  sim_opcode="ppc-opcode-simple";;
-  *)   sim_opcode="ppc-opcode-${enableval}";;
+  yes|no)      AC_MSG_ERROR("No value supplied for --enable-sim-opcode=file");;
+  *)           if test -f "${enableval}"; then
+                 sim_opcode="${enableval}"
+               elif test -f "ppc-opcode-${enableval}"; then
+                 sim_opcode="ppc-opcode-${enableval}"
+               else
+                 AC_MSG_ERROR("File $enableval is not an opcode rules file");
+                 sim_opcode="ppc-opcode-complex"
+               fi;;
 esac
 if test x"$silent" != x"yes" && test x"$sim_opcode" != x""; then
   echo "Setting opcode flags = $sim_opcode" 6>&1
-fi],[sim_opcode="ppc-opcode-simple"; echo "Setting opcode flags = $sim_opcode"])dnl
+fi],[sim_opcode="ppc-opcode-complex"
+if test x"$silent" != x"yes"; then
+  echo "Setting opcode flags = $sim_opcode"
+fi])dnl
 
 AC_ARG_ENABLE(sim-switch,
 [  --enable-sim-switch                 Use a switch instead of a table for instruction call.],
 [case "${enableval}" in
   yes) sim_switch="-s";;
-  *)   sim_switch="";;
+  no)  sim_switch="";;
+  *)   AC_MSG_ERROR("--enable-sim-switch does not take a value"); sim_switch="";;
 esac
 if test x"$silent" != x"yes" && test x"$sim_switch" != x""; then
   echo "Setting switch flags = $sim_switch" 6>&1
@@ -62,8 +81,9 @@ fi])dnl
 AC_ARG_ENABLE(sim-duplicate,
 [  --enable-sim-duplicate              Expand (duplicate) semantic functions.],
 [case "${enableval}" in
-   yes)        sim_dup="-e";;
-   *)  sim_dup="";;
+  yes) sim_dup="-e";;
+  no)  sim_dup="";;
+  *)   AC_MSG_ERROR("--enable-sim-duplicate does not take a value"); sim_dup="";;
 esac
 if test x"$silent" != x"yes" && test x"$sim_dup" != x""; then
   echo "Setting duplicate flags = $sim_dup" 6>&1
@@ -75,8 +95,9 @@ fi])dnl
 AC_ARG_ENABLE(sim-filter,
 [  --enable-sim-filter=rule            Specify filter rules.],
 [case "${enableval}" in
-   yes)        sim_filter="";;
-   *)  sim_filter="-f $enableval";;
+  yes) AC_MSG_ERROR("--enable-sim-filter must be specified with a rule to filter or no"); sim_filter="";;
+  no)  sim_filter="";;
+  *)   sim_filter="-f $enableval";;
 esac
 if test x"$silent" != x"yes" && test x"$sim_filter" != x""; then
   echo "Setting filter flags = $sim_filter" 6>&1
@@ -88,9 +109,10 @@ fi])dnl
 AC_ARG_ENABLE(sim-icache,
 [  --enable-sim-icache=size            Specify instruction cache size.],
 [case "${enableval}" in
-   yes)        sim_icache="-r 1024";;
-   *)  sim_icache="";;
-esac],[sim_icache=""])dnl
+  yes) sim_icache="-r 1024";;
+  no)  sim_icache="";;
+  *)   sim_icache="-r ${enableval}";;
+esac],[sim_icache="-r 1024"])dnl
 
 AC_ARG_ENABLE(sim-inline,
 [  --enable-sim-inline=inlines         Specify which functions should be inlined.],
@@ -131,7 +153,7 @@ AC_ARG_ENABLE(sim-bswap,
 [case "${enableval}" in
   yes) sim_bswap="-DWITH_BSWAP=1";;
   no)  sim_bswap="-DWITH_BSWAP=0";;
-  *)   sim_bswap="";;
+  *)   AC_MSG_ERROR("--enable-sim-bswap does not take a value"); sim_bswap="";;
 esac
 if test x"$silent" != x"yes" && test x"$sim_bswap" != x""; then
   echo "Setting bswap flags = $sim_bswap" 6>&1
@@ -148,7 +170,7 @@ AC_ARG_ENABLE(sim-endian,
   no)   sim_endian="-DWITH_TARGET_BYTE_ORDER=0";;
   b*|B*) sim_endian="-DWITH_TARGET_BYTE_ORDER=BIG_ENDIAN";;
   l*|L*) sim_endian="-DWITH_TARGET_BYTE_ORDER=LITTLE_ENDIAN";;
-  *)   sim_endian="";;
+  *)    AC_MSG_ERROR("Unknown value $enableval for --enable-sim-endian"); sim_endian="";;
 esac
 if test x"$silent" != x"yes" && test x"$sim_endian" != x""; then
   echo "Setting endian flags = $sim_endian" 6>&1
@@ -160,7 +182,7 @@ AC_ARG_ENABLE(sim-hostendian,
   no)   sim_hostendian="-DWITH_HOST_BYTE_ORDER=0";;
   b*|B*) sim_hostendian="-DWITH_HOST_BYTE_ORDER=BIG_ENDIAN";;
   l*|L*) sim_hostendian="-DWITH_HOST_BYTE_ORDER=LITTLE_ENDIAN";;
-  *)    sim_hostendian="";;
+  *)    AC_MSG_ERROR("Unknown value $enableval for --enable-sim-hostendian"); sim_hostendian="";;
 esac
 if test x"$silent" != x"yes" && test x"$sim_hostendian" != x""; then
   echo "Setting hostendian flags = $sim_hostendian" 6>&1
@@ -183,20 +205,18 @@ fi])dnl
 AC_ARG_ENABLE(sim-bitsize,
 [  --enable-sim-bitsize=n              Specify target bitsize (32 or 64).],
 [case "${enableval}" in
-  yes) sim_bitsize="";;
-  no)  sim_bitsize="";;
-  *)   sim_bitsize="-DWITH_TARGET_WORD_BITSIZE=$enableval";;
+  32|64) sim_bitsize="-DWITH_TARGET_WORD_BITSIZE=$enableval";;
+  *)    AC_MSG_ERROR("--enable-sim-bitsize was given $enableval, expected 32 or 64"); sim_bitsize="";;
 esac
 if test x"$silent" != x"yes" && test x"$sim_bitsize" != x""; then
   echo "Setting bitsize flags = $sim_bitsize" 6>&1
 fi],[sim_bitsize=""])dnl
 
 AC_ARG_ENABLE(sim-hostbitsize,
-[  --enable-sim-hostbitsize=n          Specify host bitsize (32 or 64).],
+[  --enable-sim-hostbitsize=32|64      Specify host bitsize (32 or 64).],
 [case "${enableval}" in
-  yes) sim_hostbitsize="";;
-  no)  sim_hostbitsize="";;
-  *)   sim_hostbitsize="-DWITH_HOST_WORD_BITSIZE=$enableval";;
+  32|64) sim_hostbitsize="-DWITH_HOST_WORD_BITSIZE=$enableval";;
+  *)    AC_MSG_ERROR("--enable-sim-hostbitsize was given $enableval, expected 32 or 64"); sim_hostbitsize="";;
 esac
 if test x"$silent" != x"yes" && test x"$sim_hostbitsize" != x""; then
   echo "Setting hostbitsize flags = $sim_hostbitsize" 6>&1
@@ -208,7 +228,8 @@ AC_ARG_ENABLE(sim-env,
   operating | os | oea)        sim_env="-DWITH_ENVIRONMENT=OPERATING_ENVIRONMENT";;
   virtual | vea)       sim_env="-DWITH_ENVIRONMENT=VIRTUAL_ENVIRONMENT";;
   user | uea)          sim_env="-DWITH_ENVIRONMENT=USER_ENVIRONMENT";;
-  *)                   sim_env="";;
+  no)                  sim_env="-DWITH_ENVIRONMENT=0";;
+  *)                   AC_MSG_ERROR("Unknown value $enableval passed to --enable-sim-env"); sim_env="";;
 esac
 if test x"$silent" != x"yes" && test x"$sim_env" != x""; then
   echo "Setting env flags = $sim_env" 6>&1
@@ -219,7 +240,7 @@ AC_ARG_ENABLE(sim-timebase,
 [case "${enableval}" in
   yes) sim_timebase="-DWITH_TIME_BASE=1";;
   no)  sim_timebase="-DWITH_TIME_BASE=0";;
-  *)   sim_timebase="";;
+  *)   AC_MSG_ERROR("--enable-sim-timebase does not take a value"); sim_timebase="";;
 esac
 if test x"$silent" != x"yes" && test x"$sim_timebase" != x""; then
   echo "Setting timebase flags = $sim_timebase" 6>&1
@@ -230,7 +251,7 @@ AC_ARG_ENABLE(sim-alignment,
 [case "${enableval}" in
   yes | strict | STRICT)       sim_alignment="-DWITH_ALIGNMENT=STRICT_ALIGNMENT";;
   no | nonstrict | NONSTRICT)  sim_alignment="-DWITH_ALIGNMENT=NONSTRICT_ALIGNMENT";;
-  *)                           sim_alignment="-DWITH_ALIGNMENT=$enableval";;
+  *)                           AC_MSG_ERROR("Unknown value $enableval passed to --enable-sim-alignment"); sim_alignment="";;
 esac
 if test x"$silent" != x"yes" && test x"$sim_alignment" != x""; then
   echo "Setting alignment flags = $sim_alignment" 6>&1
@@ -241,7 +262,7 @@ AC_ARG_ENABLE(sim-trace,
 [case "${enableval}" in
   yes) sim_trace="-DWITH_TRACE=1";;
   no)  sim_trace="-DWITH_TRACE=0";;
-  *)   sim_trace="";;
+  *)   AC_MSG_ERROR("--enable-sim-trace does not take a value"); sim_trace="";;
 esac
 if test x"$silent" != x"yes" && test x"$sim_trace" != x""; then
   echo "Setting trace flags = $sim_trace" 6>&1
@@ -252,18 +273,29 @@ AC_ARG_ENABLE(sim-assert,
 [case "${enableval}" in
   yes) sim_assert="-DWITH_ASSERT=1";;
   no)  sim_assert="-DWITH_ASSERT=0";;
-  *)   sim_assert="";;
+  *)   AC_MSG_ERROR("--enable-sim-assert does not take a value"); sim_assert="";;
 esac
 if test x"$silent" != x"yes" && test x"$sim_assert" != x""; then
   echo "Setting assert flags = $sim_assert" 6>&1
 fi],[sim_assert=""])dnl
 
+AC_ARG_ENABLE(sim-reserved-bits,
+[  --enable-sim-reserved-bits          Specify whether to check reserved bits in instruction.],
+[case "${enableval}" in
+  yes) sim_reserved="-DWITH_RESERVED_BITS=1";;
+  no)  sim_reserved="-DWITH_RESERVED_BITS=0";;
+  *)   AC_MSG_ERROR("--enable-sim-reserved-bits does not take a value"); sim_reserved="";;
+esac
+if test x"$silent" != x"yes" && test x"$sim_reserved" != x""; then
+  echo "Setting reserved flags = $sim_reserved" 6>&1
+fi],[sim_reserved=""])dnl
+
 AC_ARG_ENABLE(sim-float,
 [  --enable-sim-float                  Specify whether to use host floating point or simulate.],
 [case "${enableval}" in
   yes | hard)  sim_float="-DWITH_FLOATING_POINT=HARD_FLOATING_POINT";;
   no | soft)   sim_float="-DWITH_FLOATING_POINT=SOFT_FLOATING_POINT";;
-  *)           sim_float="";;
+  *)           AC_MSG_ERROR("Unknown value $enableval passed to --enable-sim-float"); sim_float="";;
 esac
 if test x"$silent" != x"yes" && test x"$sim_float" != x""; then
   echo "Setting float flags = $sim_float" 6>&1
@@ -276,7 +308,7 @@ AC_ARG_ENABLE(sim-monitor,
   no)          sim_mon="-DWITH_MON=0";;
   instruction) sim_mon="-DWITH_MON=MONITOR_INSTRUCTION_ISSUE";;
   memory)      sim_mon="-DWITH_MON=MONITOR_LOAD_STORE_UNIT";;
-  *)           sim_mon="-DWITH_MON='$enableval'";;
+  *)           AC_MSG_ERROR("Unknown value $enableval passed to --enable-sim-mon"); sim_env="";;
 esac
 if test x"$silent" != x"yes" && test x"$sim_mon" != x""; then
   echo "Setting monitor flags = $sim_mon" 6>&1
@@ -287,7 +319,7 @@ AC_ARG_ENABLE(sim-function-unit,
 [case "${enableval}" in
   yes) sim_func="-DWITH_FUNCTION_UNIT=1";;
   no)  sim_func="-DWITH_FUNCTION_UNIT=0";;
-  *)   sim_func="";;
+  *)   AC_MSG_ERROR("--enable-sim-function-unit does not take a value"); sim_func="";;
 esac
 if test x"$silent" != x"yes" && test x"$sim_func" != x""; then
   echo "Setting function-unit flags = $sim_func" 6>&1
@@ -296,9 +328,8 @@ fi],[sim_func=""])dnl
 AC_ARG_ENABLE(sim-model,
 [  --enable-sim-model=which            Specify PowerPC to model.],
 [case "${enableval}" in
-  yes) sim_model="";;
-  no)  sim_model="";;
-  *)   sim_model="-DWITH_PPC_MODEL=${enableval}";;
+  yes|no)      AC_MSG_ERROR("No value supplied for --enable-sim-model=model");;
+  *)           sim_model="-DWITH_MODEL=${enableval}";;
 esac
 if test x"$silent" != x"yes" && test x"$sim_model" != x""; then
   echo "Setting model flags = $sim_model" 6>&1
@@ -307,9 +338,8 @@ fi],[sim_model=""])dnl
 AC_ARG_ENABLE(sim-default-model,
 [  --enable-sim-default-model=which    Specify default PowerPC to model.],
 [case "${enableval}" in
-  yes) sim_default_model="";;
-  no)  sim_default_model="";;
-  *)   sim_default_model="-DWITH_DEFAULT_PPC_MODEL=${enableval}";;
+  yes|no)      AC_MSG_ERROR("No value supplied for --enable-sim-default-model=model");;
+  *)           sim_default_model="-DWITH_DEFAULT_MODEL=${enableval}";;
 esac
 if test x"$silent" != x"yes" && test x"$sim_default_model" != x""; then
   echo "Setting default-model flags = $sim_default_model" 6>&1
@@ -350,6 +380,7 @@ AC_SUBST(sim_alignment)
 AC_SUBST(sim_float)
 AC_SUBST(sim_trace)
 AC_SUBST(sim_assert)
+AC_SUBST(sim_reserved)
 AC_SUBST(sim_monitor)
 AC_SUBST(sim_func)
 AC_SUBST(sim_model)
index 49d567efa3dd4bc312bba6415ffc18d9d9568a63..f9940d82c9329f1a52d47d4a1e1bc4a66e597b67 100644 (file)
@@ -43,24 +43,35 @@ enum {
   max_insn_size = 32,
 };
 
-int hi_bit_nr = 0;
-int insn_size = max_insn_size;
-int idecode_expand_semantics = 0;
-int idecode_cache = 0;
-int number_lines = 1;
+static int hi_bit_nr = 0;
+static int insn_size = max_insn_size;
+static int idecode_expand_semantics = 0;
+static int idecode_cache = 0;
+static int number_lines = 1;
 
 
 /****************************************************************/
 
 
-char *cache_idecode_formal = "cpu *processor,\n instruction_word instruction,\n unsigned_word cia,\n idecode_cache *cache_entry";
-char *cache_idecode_actual = "processor, instruction, cia, cache_entry";
+static char *cache_idecode_formal  =
+"cpu *processor,\n\
+ instruction_word instruction,\n\
+ unsigned_word cia,\n\
+ idecode_cache *cache_entry";
 
-char *cache_semantic_formal = "cpu *processor,\n idecode_cache *cache_entry,\n unsigned_word cia";
-char *cache_semantic_actual = "processor, entry, cia";
+static char *cache_idecode_actual = "processor, instruction, cia, cache_entry";
 
-char *semantic_formal = "cpu *processor,\n instruction_word instruction,\n unsigned_word cia";
-char *semantic_actual = "processor, instruction, cia";
+static char *cache_semantic_formal =
+"cpu *processor,\n\
+ idecode_cache *cache_entry,\n\
+ unsigned_word cia";
+
+static char *semantic_formal = 
+"cpu *processor,\n\
+ instruction_word instruction,\n\
+ unsigned_word cia";
+
+static char *semantic_actual = "processor, instruction, cia";
 
 
 
@@ -72,7 +83,7 @@ struct _filter {
   char *flag;
   filter *next;
 };
-filter *filters = NULL;
+static filter *filters = NULL;
 
 
 /****************************************************************/
@@ -87,7 +98,7 @@ struct _cache_rules {
   char *expression;
   cache_rules *next;
 };
-cache_rules *cache_table;
+static cache_rules *cache_table;
 
 
 enum {
@@ -102,7 +113,7 @@ enum {
 static cache_rules *
 load_cache_rules(char *file_name)
 {
-  table *file = table_open(file_name, nr_cache_rule_fields);
+  table *file = table_open(file_name, nr_cache_rule_fields, 0);
   table_entry *entry;
   cache_rules *table = NULL;
   cache_rules **curr_rule = &table;
@@ -167,7 +178,7 @@ struct _opcode_rules {
   unsigned special_rule;
   opcode_rules *next;
 };
-opcode_rules *opcode_table;
+static opcode_rules *opcode_table;
 
 
 enum {
@@ -188,7 +199,7 @@ enum {
 static opcode_rules *
 load_opcode_rules(char *file_name)
 {
-  table *file = table_open(file_name, nr_opcode_fields);
+  table *file = table_open(file_name, nr_opcode_fields, 0);
   table_entry *entry;
   opcode_rules *table = NULL;
   opcode_rules **curr_rule = &table;
@@ -567,18 +578,19 @@ typedef enum {
   insn_nmemonic,
   insn_name,
   insn_comment,
-  nr_insn_table_fields,
+  nr_insn_table_fields
 } insn_table_fields;
-char *insn_field_name[nr_insn_table_fields] = {
-  "format", "form", "flags", "nmemonic", "name", "comments"
-};
 
 typedef enum {
   function_type = insn_format,
   function_name = insn_name,
-  function_param = insn_comment,
+  function_param = insn_comment
 } function_table_fields;
 
+typedef enum {
+  model_name = insn_name,
+  model_func = insn_comment,
+} model_table_fields;
 
 typedef struct _insn insn;
 struct _insn {
@@ -587,6 +599,23 @@ struct _insn {
   insn *next;
 };
 
+typedef struct _model_func_unit model_func_unit;
+struct _model_func_unit {
+  model_func_unit *next;
+  char *name;
+  char *comment;
+  int number;
+  unsigned mask;
+};
+
+typedef struct _model model;
+struct _model {
+  model *next;
+  char *name;
+  model_func_unit *func_unit_start;
+  model_func_unit *func_unit_end;
+};
+  
 typedef struct _insn_table insn_table;
 struct _insn_table {
   int opcode_nr;
@@ -594,6 +623,9 @@ struct _insn_table {
   int nr_insn;
   insn *insns;
   insn *functions;
+  insn *last_function;
+  int max_func_unit_name_len;
+  unsigned max_func_unit_mask;
   opcode_rules *opcode_rule;
   opcode_field *opcode;
   int nr_entries;
@@ -602,23 +634,135 @@ struct _insn_table {
   insn_table *parent;
 };
 
+typedef enum {
+  insn_model_name,
+  insn_model_unit,
+  insn_model_issue,
+  insn_model_done,
+  insn_model_flags,
+  nr_insn_model_table_fields
+} insn_model_table_fields;
+
+static model *models;
+static model *last_model;
 
 
 static void
 insn_table_insert_function(insn_table *table,
                           table_entry *file_entry)
 {
-  insn **ptr_to_cur_function = &table->functions;
-
   /* create a new function */
   insn *new_function = ZALLOC(insn);
   new_function->file_entry = file_entry;
 
   /* append it to the end of the function list */
-  while (*ptr_to_cur_function != NULL) {
-    ptr_to_cur_function = &(*ptr_to_cur_function)->next;
+  if (table->last_function)
+    table->last_function->next = new_function;
+  else
+    table->functions = new_function;
+  table->last_function = new_function;
+}
+
+
+static void
+model_table_insert(insn_table *table,
+                  table_entry *file_entry)
+{
+  /* create a new model */
+  model *new_model = ZALLOC(model);
+  model_func_unit *func_unit;
+  char *ptr, *end, *end_name, *comment, *name;
+  int ch;
+  int name_len;
+  int func_name_len;
+  unsigned unit, mask;
+  int number;
+
+  new_model->name = file_entry->fields[model_name];
+  name_len = strlen(new_model->name);
+
+  /* append it to the end of the model list */
+  if (last_model)
+    last_model->next = new_model;
+  else
+    models = new_model;
+  last_model = new_model;
+
+  /* Parse the function units separated by commas */
+  unit = 1;
+  for (ptr = file_entry->fields[model_func];
+       ((ch = *ptr) != '\0') && (ch != '\n');
+       ptr = (*end == ',') ? end+1 : end) {
+
+    while (ch == ' ' || ch == '\t')
+      ch = *++ptr;
+
+    if (!ch || ch == '\n')
+      break;
+
+    /* Search for comma or newline ending field */
+    end = ptr;
+    end_name = (char *)0;
+
+    if (ch == ',')
+      continue;
+
+    while (ch != '\0' && ch != ',' && ch != '\n') {
+      if (end_name == (char *)0 && (ch == '=' || isspace(ch)))
+       end_name = end;
+
+      ch = *++end;
+    }
+    if (!end_name)
+      end_name = end;
+
+    func_unit = ZALLOC(model_func_unit);
+    if (new_model->func_unit_end)
+      new_model->func_unit_end->next = func_unit;
+    else
+      new_model->func_unit_start = func_unit;
+
+    new_model->func_unit_end = func_unit;
+
+    /* Record function unit name as model name _ unit name */
+    func_name_len = name_len + end_name - ptr + 2;
+    if (table->max_func_unit_name_len < func_name_len)
+      table->max_func_unit_name_len = func_name_len;
+
+    func_unit->name = name = (char *)zalloc(func_name_len);
+    memcpy(name, new_model->name, name_len);
+    name[name_len] = '_';
+    memcpy(name + name_len + 1, ptr, end_name - ptr);
+
+    /* See if there are multiple functional units */
+    if (*end_name == '=') {
+      number = 0;
+      for(end_name++; end_name < end && isdigit(*end_name); end_name++)
+       number = number * 10 + (*end_name - '0');
+    } else {
+      number = 1;
+    }
+
+    /* Now figure out the mask for these unit(s) */
+    func_unit->number = number;
+    mask = 0;
+    while (number--) {
+      ASSERT(unit != 0);
+      mask |= unit;
+      unit <<= 1;
+    }
+    func_unit->mask = mask;
+    table->max_func_unit_mask |= mask;
+
+    /* Now figure out comments */
+    for (comment = end_name; comment < end && ((ch = *comment) == ' ' || ch == '\t'); comment++)
+      ;
+
+    if (comment < end) {
+      func_unit->comment = (char *)zalloc(end - comment + 1);
+      memcpy(func_unit->comment, comment, end - comment);
+    }
   }
-  *ptr_to_cur_function = new_function;
 }
 
 
@@ -629,12 +773,34 @@ insn_table_insert_insn(insn_table *table,
 {
   insn **ptr_to_cur_insn = &table->insns;
   insn *cur_insn = *ptr_to_cur_insn;
+  table_model_entry *insn_model_ptr;
+  model *model_ptr;
 
   /* create a new instruction */
   insn *new_insn = ZALLOC(insn);
   new_insn->file_entry = file_entry;
   new_insn->fields = fields;
 
+  /* Check out any model information returned to make sure the model
+     is correct.  */
+  for(insn_model_ptr = file_entry->model_first; insn_model_ptr; insn_model_ptr = insn_model_ptr->next) {
+    char *name = insn_model_ptr->fields[insn_model_name];
+
+    for(model_ptr = models; model_ptr; model_ptr = model_ptr->next) {
+      if (strcmp(name, model_ptr->name) == 0) {
+
+       /* Replace the name field with that of the global model, so that when we
+          want to print it out, we can just compare pointers.  */
+       insn_model_ptr->fields[insn_model_name] = model_ptr->name;
+       break;
+      }
+    }
+
+    if (!model_ptr)
+      error("%s:%d: machine model `%s' was not known about\n",
+           file_entry->file_name, file_entry->line_nr, name);
+  }
+
   /* insert it according to the order of the fields */
   while (cur_insn != NULL
         && new_insn->fields->value >= cur_insn->fields->value) {
@@ -902,7 +1068,7 @@ insn_table_expand_insns(insn_table *table)
 static insn_table *
 insn_table_load_insns(char *file_name)
 {
-  table *file = table_open(file_name, nr_insn_table_fields);
+  table *file = table_open(file_name, nr_insn_table_fields, nr_insn_model_table_fields);
   insn_table *table = ZALLOC(insn_table);
   table_entry *file_entry;
   table->opcode_rule = opcode_table;
@@ -912,6 +1078,9 @@ insn_table_load_insns(char *file_name)
        || it_is("internal", file_entry->fields[insn_flags])) {
       insn_table_insert_function(table, file_entry);
     }
+    else if (it_is("model", file_entry->fields[insn_flags])) {
+      model_table_insert(table, file_entry);
+    }
     else {
       insn_fields *fields;
       /* skip instructions that aren't relevant to the mode */
@@ -1854,7 +2023,7 @@ lf_print_c_validate(lf *file,
       lf_printf(file, "\n");
       lf_printf(file, "/* validate: %s */\n",
                instruction->file_entry->fields[insn_format]);
-      lf_printf(file, "if (WITH_ASSERT && (instruction & 0x%x) != 0x%x)\n",
+      lf_printf(file, "if (WITH_RESERVED_BITS && (instruction & 0x%x) != 0x%x)\n",
                check_mask, check_val);
       lf_indent(file, +2);
       lf_print_idecode_illegal(file);
@@ -2722,6 +2891,202 @@ gen_itable_c(insn_table *table, lf *file)
 
   lf_printf(file, "\n");
   lf_printf(file, "#endif /* _ITABLE_C_ */\n");
+}
+
+/****************************************************************/
+
+static void 
+gen_model_h(insn_table *table, lf *file)
+{
+  model *model_ptr;
+  model_func_unit *func_unit_ptr;
+  int hex_size;
+
+  lf_print_copyleft(file);
+  lf_printf(file, "\n");
+  lf_printf(file, "#ifndef _MODEL_H_\n");
+  lf_printf(file, "#define _MODEL_H_\n");
+  lf_printf(file, "\n");
+  lf_printf(file, "#ifndef INLINE_MODEL\n");
+  lf_printf(file, "#define INLINE_MODEL\n");
+  lf_printf(file, "#endif\n");
+  lf_printf(file, "\n");
+
+  lf_printf(file, "typedef struct _model_time {\t/* Instruction cycle time */\n");
+  if (table->max_func_unit_mask > 0xffff) {
+    hex_size = 8;
+    lf_printf(file, "  unsigned32 units;\n");
+    lf_printf(file, "  unsigned16 initial;\n");
+    lf_printf(file, "  unsigned16 finish;\n");
+  } else {
+    hex_size = 4;
+    lf_printf(file, "  unsigned16 units;\n");
+    lf_printf(file, "  unsigned8  initial;\n");
+    lf_printf(file, "  unsigned8  finish;\n");
+  }
+  lf_printf(file, "  unsigned32 flags;\n");
+  lf_printf(file, "} model_time;\n");
+  lf_printf(file, "\n");
+
+  lf_printf(file, "typedef enum _model_enum {\n");
+  lf_printf(file, "  MODEL_NONE,\n");
+  for (model_ptr = models; model_ptr; model_ptr = model_ptr->next) {
+    lf_printf(file, "  MODEL_%s,\n", model_ptr->name);
+  }
+  lf_printf(file, "  nr_models\n");
+  lf_printf(file, "} model_enum;\n");
+  lf_printf(file, "\n");
+
+  for (model_ptr = models; model_ptr; model_ptr = model_ptr->next) {
+    for (func_unit_ptr = model_ptr->func_unit_start; func_unit_ptr; func_unit_ptr = func_unit_ptr->next) {
+      if (func_unit_ptr->comment) {
+       lf_printf(file, "#define %-*s 0x%.*x  /* %s functional unit */\n",
+                 table->max_func_unit_name_len, func_unit_ptr->name,
+                 hex_size, func_unit_ptr->mask,
+                 func_unit_ptr->comment);
+      } else {
+       lf_printf(file, "#define %-*s 0x%.*x\n",
+                 table->max_func_unit_name_len, func_unit_ptr->name,
+                 hex_size, func_unit_ptr->mask);
+      }
+    }
+    lf_printf(file, "\n");
+  }
+
+  lf_printf(file, "extern const char *model_name[ (int)nr_models ];\n");
+  lf_printf(file, "extern const char *const *const model_func_unit_name[ (int)nr_models ];\n");
+  lf_printf(file, "extern const model_time *const model_time_mapping[];\n");
+  lf_printf(file, "\n");
+  lf_printf(file, "#endif /* _MODEL_H_ */\n");
+}
+
+/****************************************************************/
+
+typedef struct _model_c_data model_c_data;
+struct _model_c_data {
+  lf *file;
+  model *model_ptr;
+};
+
+static void
+model_c_insn(insn_table *entry,
+             void *data,
+             insn *instruction)
+{
+  model_c_data *data_ptr = (model_c_data *)data;
+  lf *file = data_ptr->file;
+  model *current_model = data_ptr->model_ptr;
+  table_model_entry *model_ptr = instruction->file_entry->model_first;
+  int i;
+
+  while (model_ptr) {
+    if (model_ptr->fields[insn_model_name] == current_model->name) {
+      lf_printf(file, "  {");
+      for(i = insn_model_unit; i < nr_insn_model_table_fields; i++) {
+       lf_printf(file, " %s,", model_ptr->fields[i]);
+      }
+      lf_printf(file, " },\n");
+      return;
+    }
+
+    model_ptr = model_ptr->next;
+  }
+
+  lf_printf(file, "  { 0 },\n");
+}
+
+static void 
+gen_model_c(insn_table *table, lf *file)
+{
+  model *model_ptr;
+  model_func_unit *func_unit_ptr;
+  int i;
+
+  lf_print_copyleft(file);
+  lf_printf(file, "\n");
+  lf_printf(file, "#ifndef _MODEL_C_\n");
+  lf_printf(file, "#define _MODEL_C_\n");
+  lf_printf(file, "\n");
+  lf_printf(file, "#ifndef STATIC_INLINE_MODEL\n");
+  lf_printf(file, "#define STATIC_INLINE_MODEL STATIC_INLINE\n");
+  lf_printf(file, "#endif\n");
+  lf_printf(file, "\n");
+  lf_printf(file, "#include \"cpu.h\"\n");
+  lf_printf(file, "\n");
+
+  lf_printf(file, "/* map model enumeration into printable string */\n");
+  lf_printf(file, "const char *model_name[ (int)nr_models ] = {\n");
+  lf_printf(file, "  \"NONE\",\n");
+  for (model_ptr = models; model_ptr; model_ptr = model_ptr->next) {
+    lf_printf(file, "  \"%s\",\n", model_ptr->name);
+  }
+  lf_printf(file, "};\n");
+  lf_printf(file, "\n");
+
+  lf_printf(file, "/* Emit each model's individual function unit names */\n");
+  lf_printf(file, "static const char *const model_func_unit_name_NONE[] = {\n");
+  lf_printf(file, "  \"none\",\n");
+  lf_printf(file, "  (const char *)0\n");
+  lf_printf(file, "};\n");
+  lf_printf(file, "\n");
+
+  for (model_ptr = models; model_ptr; model_ptr = model_ptr->next) {
+    lf_printf(file, "static const char *const model_func_unit_name_%s[] = {\n", model_ptr->name);
+    lf_printf(file, "  \"none\",\n");
+    for (func_unit_ptr = model_ptr->func_unit_start; func_unit_ptr; func_unit_ptr = func_unit_ptr->next) {
+
+      if (func_unit_ptr->comment)
+       lf_printf(file, "  \"%s %s functional unit\",\n", func_unit_ptr->name, func_unit_ptr->comment);
+      else
+       lf_printf(file, "  \"%s\",\n", func_unit_ptr->name);
+
+      for(i = 2; i < func_unit_ptr->number; i++) {
+       if (func_unit_ptr->comment)
+         lf_printf(file, "  \"%s %s functional unit #%d\",\n", func_unit_ptr->name,
+                   func_unit_ptr->comment, i);
+       else
+         lf_printf(file, "  \"%s #%d\",\n", func_unit_ptr->name, i);
+      }
+    }
+
+    lf_printf(file, "  (const char *)0\n");
+    lf_printf(file, "};\n");
+    lf_printf(file, "\n");
+  }
+
+  lf_printf(file, "/* Array to map model,function unit number to printable string. */\n");
+  lf_printf(file, "const char *const *const model_func_unit_name[] = {\n");
+  lf_printf(file, "  model_func_unit_name_NONE,\n");
+  for(model_ptr = models; model_ptr; model_ptr = model_ptr->next) {
+    lf_printf(file, "  model_func_unit_name_%s,\n", model_ptr->name);
+  }
+  lf_printf(file, "};\n");
+  lf_printf(file, "\n");
+
+  lf_printf(file, "/* Insn functional unit info */\n");
+  for(model_ptr = models; model_ptr; model_ptr = model_ptr->next) {
+    model_c_data data;
+
+    lf_printf(file, "static const model_time model_time_%s[] = {\n", model_ptr->name);
+    data.file = file;
+    data.model_ptr = model_ptr;
+    insn_table_traverse_insn(table,
+                            (void *)&data,
+                            model_c_insn);
+
+    lf_printf(file, "};\n");
+    lf_printf(file, "\n");
+  }
+
+  lf_printf(file, "const model_time *const model_time_mapping[] = {\n");
+  lf_printf(file, "  (const model_time *const)0,\n");
+  for(model_ptr = models; model_ptr; model_ptr = model_ptr->next) {
+    lf_printf(file, "  model_time_%s,\n", model_ptr->name);
+  }
+  lf_printf(file, "};\n");
+  lf_printf(file, "\n");
+
+  lf_printf(file, "#endif /* _MODEL_C_ */\n");
 
 }
 
@@ -2755,12 +3120,13 @@ main(int argc,
     printf("Output options:\n");
     printf("  -[Cc] <output-file>  output icache.h(C) invalid(c)\n");
     printf("  -[Dd] <output-file>  output idecode.h(D) idecode.c(d)\n");
+    printf("  -[Mm] <output-file>  output model.h(M) model.c(M)\n");
     printf("  -[Ss] <output-file>  output schematic.h(S) schematic.c(s)\n");
     printf("  -[Tt] <table>      output itable.h(T) itable.c(t)\n");
   }
 
   while ((ch = getopt(argc, argv,
-                     "leb:h:r:f:I:i:O:o:K:k:n:S:s:D:d:T:t:C:")) != -1) {
+                     "leb:h:r:f:I:i:O:o:K:k:M:m:n:S:s:D:d:T:t:C:")) != -1) {
     fprintf(stderr, "\t-%c %s\n", ch, (optarg ? optarg : ""));
     switch(ch) {
     case 'l':
@@ -2822,6 +3188,8 @@ main(int argc,
     case 's':
     case 'D':
     case 'd':
+    case 'M':
+    case 'm':
     case 'T':
     case 't':
     case 'C':
@@ -2841,6 +3209,12 @@ main(int argc,
        case 'd':
          gen_idecode_c(instructions, file);
          break;
+       case 'M':
+         gen_model_h(instructions, file);
+         break;
+       case 'm':
+         gen_model_c(instructions, file);
+         break;
        case 'T':
          gen_itable_h(instructions, file);
          break;
index 646e696f75896cbc0a07a3fe0270c8c7fe73ed62..51af04ff2c4ecdb7edc902d162176721832f903b 100644 (file)
 #endif
 #endif
 
+#if MODEL_INLINE
+#if MODEL_INLINE == 2
+#define INLINE_MODEL static INLINE
+#else
+#define INLINE_MODEL static
+#endif
+#endif
+
 #if BITS_INLINE
 #if BITS_INLINE == 2
 #define INLINE_BITS static INLINE
index 168a4d0aa6087c889f1a7a904e68632191b46032..161b0d101cab7993df98c168dc966c2e2474efda 100644 (file)
@@ -131,6 +131,7 @@ print_options (void)
   printf_filtered ("WITH_FUNCTION_UNIT       = %d\n", WITH_FUNCTION_UNIT);
   printf_filtered ("WITH_DEFAULT_PPC_MODEL   = %s\n", options_ppc (WITH_DEFAULT_PPC_MODEL));
   printf_filtered ("WITH_PPC_MODEL           = %s\n", options_ppc (WITH_PPC_MODEL));
+  printf_filtered ("WITH_RESERVE_BITS        = %d\n", WITH_RESERVE_BITS);
   printf_filtered ("DEFAULT_INLINE           = %d\n", DEFAULT_INLINE);
   printf_filtered ("SIM_ENDIAN_INLINE        = %d\n", SIM_ENDIAN_INLINE);
   printf_filtered ("BITS_INLINE              = %d\n", BITS_INLINE);