aboutsummaryrefslogtreecommitdiff
path: root/sim/ppc
diff options
context:
space:
mode:
authorMichael Meissner <gnu@the-meissners.org>1995-11-10 22:49:05 +0000
committerMichael Meissner <gnu@the-meissners.org>1995-11-10 22:49:05 +0000
commita31140524a0771e27cd25af1648d32b3ceaa36ed (patch)
treefb05853d32fca4a28d9462b2b476920c7a59a363 /sim/ppc
parentaa917e719d60206457ee4fbde8b3b070c5a119d4 (diff)
downloadgdb-a31140524a0771e27cd25af1648d32b3ceaa36ed.zip
gdb-a31140524a0771e27cd25af1648d32b3ceaa36ed.tar.gz
gdb-a31140524a0771e27cd25af1648d32b3ceaa36ed.tar.bz2
Tons of changes to allow model specific information in the instruction file.
Diffstat (limited to 'sim/ppc')
-rw-r--r--sim/ppc/ChangeLog48
-rwxr-xr-xsim/ppc/configure128
-rw-r--r--sim/ppc/configure.in111
-rw-r--r--sim/ppc/igen.c432
-rw-r--r--sim/ppc/inline.h8
-rw-r--r--sim/ppc/options.c1
6 files changed, 614 insertions, 114 deletions
diff --git a/sim/ppc/ChangeLog b/sim/ppc/ChangeLog
index 1447655..90d69c6 100644
--- a/sim/ppc/ChangeLog
+++ b/sim/ppc/ChangeLog
@@ -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.
diff --git a/sim/ppc/configure b/sim/ppc/configure
index 841c6a3..aaa176b 100755
--- a/sim/ppc/configure
+++ b/sim/ppc/configure
@@ -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
@@ -52,6 +52,8 @@ ac_help="$ac_help
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
--enable-sim-monitor=mon Specify whether to enable monitoring events."
@@ -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
@@ -1120,6 +1156,7 @@ fi
+
for ac_func in getrusage
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
@@ -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
diff --git a/sim/ppc/configure.in b/sim/ppc/configure.in
index 470c8c4..012e040 100644
--- a/sim/ppc/configure.in
+++ b/sim/ppc/configure.in
@@ -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)
diff --git a/sim/ppc/igen.c b/sim/ppc/igen.c
index 49d567e..f9940d8 100644
--- a/sim/ppc/igen.c
+++ b/sim/ppc/igen.c
@@ -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;
diff --git a/sim/ppc/inline.h b/sim/ppc/inline.h
index 646e696..51af04f 100644
--- a/sim/ppc/inline.h
+++ b/sim/ppc/inline.h
@@ -62,6 +62,14 @@
#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
diff --git a/sim/ppc/options.c b/sim/ppc/options.c
index 168a4d0..161b0d1 100644
--- a/sim/ppc/options.c
+++ b/sim/ppc/options.c
@@ -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);