aboutsummaryrefslogtreecommitdiff
path: root/sim/common
diff options
context:
space:
mode:
Diffstat (limited to 'sim/common')
-rw-r--r--sim/common/ChangeLog32
-rw-r--r--sim/common/Make-common.in32
-rw-r--r--sim/common/aclocal.m416
-rw-r--r--sim/common/sim-bits.h40
-rw-r--r--sim/common/sim-fpu.c26
-rw-r--r--sim/common/sim-fpu.h80
6 files changed, 171 insertions, 55 deletions
diff --git a/sim/common/ChangeLog b/sim/common/ChangeLog
index 9c3b535..d4036d9 100644
--- a/sim/common/ChangeLog
+++ b/sim/common/ChangeLog
@@ -1,3 +1,35 @@
+Sat Apr 4 20:36:25 1998 Andrew Cagney <cagney@b1.cygnus.com>
+
+ * aclocal.m4 (sim-cflags): Add -fomit-frame-pointer to defaults.
+ (sim-inline): Update to match sim-inline.[hc]
+
+ * configure: Regenerated to track ../common/aclocal.m4 changes.
+
+ * Make-common.in (sim_main_headers): Add sim-inline.h
+
+ * sim-bits.h (sim-bits.c): Include when H_REVEALS_MODULE_P.
+ selected.
+ * sim-endian.h (sim-endian.c): Ditto.
+
+ * sim-events.h (_SIM_EVENTS_H_): Replace with SIM_EVENTS_H.
+ (sim_events_set_trace): Delete unused prototype.
+
+ * sim-core.h (_SIM_CORE_H_): Replace with SIM_CORE_H.
+ * sim-core.c (_SIM_CORE_C_): Ditto for SIM_CORE_C.
+
+ * sim-fpu.h (sim-fpu.c): Include when H_REVEALS_MODULE_P.
+ (sim_fpu_to232i, sim_fpu_to232u, sim_fpu_i232to, sim_fpu_u232to):
+ Comment out, not yet implemented in sim-fpu.c.
+ (sim_fpu_zero, sim_fpu_one, sim_fpu_two, sim_fpu_qnan,
+ sim_fpu_max32, sim_fpu_max64): Mark as EXTERN_SIM_FPU.
+
+ * sim-inline.h: Rewrite description.
+ (H_REVEALS_MODULE_P, C_REVEALS_MODULE_P): Define.
+ (SIM_MAIN_INLINE): Add inline option.
+
+ * sim-inline.c (semantics.c, idecode.c, engine.c, ...): Do not
+ include generated files. Handled by generator directly.
+
Sat Apr 4 01:07:06 1998 Andrew Cagney <cagney@b1.cygnus.com>
* sim-trace.c (set_trace_option_mask): Keep TRACE_ANY_P
diff --git a/sim/common/Make-common.in b/sim/common/Make-common.in
index f0cd32f..eac0c7b 100644
--- a/sim/common/Make-common.in
+++ b/sim/common/Make-common.in
@@ -81,8 +81,7 @@ SIM_ENVIRONMENT = @sim_environment@
SIM_FLOAT = @sim_float@
SIM_HARDWARE = @sim_hardware@
SIM_HW_OBJS = @sim_hw_obj@
-SIM_DV_OBJS = @sim_dv_obj@
-SIM_DV_SRC = @sim_dv_src@
+SIM_HW = @sim_hw@
SIM_HOSTENDIAN = @sim_hostendian@
SIM_INLINE = @sim_inline@
SIM_PACKAGES = @sim_packages@
@@ -159,7 +158,6 @@ SIM_NEW_COMMON_OBJS = \
sim-watch.o \
\
$(SIM_HW_OBJS) \
- $(SIM_DV_OBJS) \
## End COMMON_PRE_CONFIG_FRAG
@@ -263,6 +261,7 @@ stamp-tvals: gentmap
sim_main_headers = \
sim-main.h \
+ $(srccom)/sim-inline.h \
$(srccom)/sim-config.h \
$(srccom)/sim-base.h \
$(srccom)/sim-basics.h \
@@ -295,6 +294,7 @@ sim-options_h = $(srccom)/sim-options.h
sim-break_h = $(srccom)/sim-break.h
sim-signal_h = $(srccom)/sim-signal.h
+# start-sanitize-am30
hw-base_h = $(srccom)/hw-base.h
hw-device_h = $(srccom)/hw-device.h
hw-handles_h = #$(srccom)/hw-handles.h
@@ -310,7 +310,7 @@ hw_base_headers = \
$(hw-handles_h) \
$(hw-ports_h) \
$(hw-properties_h) \
-
+# end-sanitize-am30
# FIXME: If this complicated way of building .o files from ../common is
# necessary, the reason should be documented here.
@@ -360,6 +360,11 @@ sim-hrw.o: $(srccom)/sim-hrw.c $(sim-assert_h) $(sim_core_h) \
$(SIM_EXTRA_DEPS)
$(CC) -c $(srccom)/sim-hrw.c $(ALL_CFLAGS)
+#start-sanitize-am30
+sim-hw.o: $(srccom)/sim-hw.c $(sim_main_headers) $(SIM_EXTRA_DEPS)
+ $(CC) -c $(srccom)/sim-hw.c $(ALL_CFLAGS)
+
+#end-sanitize-am30
sim-info.o: $(srccom)/sim-info.c $(sim-assert_h) \
$(srcroot)/include/remote-sim.h \
$(SIM_EXTRA_DEPS)
@@ -430,8 +435,24 @@ sim-break.o: $(srccom)/sim-break.c $(sim_main_headers) \
$(CC) -c $(srccom)/sim-break.c $(ALL_CFLAGS)
+# start-sanitize-am30
+# FIXME This is one very simple-minded way of generating the file hw-config.h
+hw-config.h: Makefile.in $(srccom)/Make-common.in config.status Makefile
+ rm -f tmp-hw.h
+ echo "/* generated by Makefile */" > tmp-hw.h
+ for hw in $(SIM_HW) ; do \
+ echo "extern const struct hw_device_descriptor dv_$${hw}_descriptor[];" ; \
+ done >> tmp-hw.h
+ echo "const struct hw_device_descriptor *hw_descriptors[] = {" >> tmp-hw.h
+ for hw in $(SIM_HW) ; do \
+ echo " dv_$${hw}_descriptor," ; \
+ done >> tmp-hw.h
+ echo " NULL," >> tmp-hw.h
+ echo "};" >> tmp-hw.h
+ mv tmp-hw.h hw-config.h
+
hw-base.o: $(srccom)/hw-base.c $(sim_main_headers) \
- $(hw_base_headers)
+ $(hw_base_headers) hw-config.h
$(CC) -c $(srccom)/hw-base.c $(ALL_CFLAGS)
hw-device.o: $(srccom)/hw-device.c $(sim_main_headers) \
@@ -471,6 +492,7 @@ dv-pal.o: $(srccom)/dv-pal.c $(sim_main_headers) \
$(sim-main_h) $(hw_base_headers)
$(CC) -c $(srccom)/dv-pal.c $(ALL_CFLAGS)
+#end-sanitize-am30
nrun.o: $(srccom)/nrun.c config.h tconfig.h \
$(srcroot)/include/remote-sim.h $(srcroot)/include/callback.h \
diff --git a/sim/common/aclocal.m4 b/sim/common/aclocal.m4
index 481ae33..4550b66 100644
--- a/sim/common/aclocal.m4
+++ b/sim/common/aclocal.m4
@@ -94,7 +94,7 @@ AC_SUBST(sim_bswap)
AC_ARG_ENABLE(sim-cflags,
[ --enable-sim-cflags=opts Extra CFLAGS for use in building simulator],
[case "${enableval}" in
- yes) sim_cflags="-O2";;
+ yes) sim_cflags="-O2 -fomit-frame-pointer";;
trace) AC_MSG_ERROR("Please use --enable-sim-debug instead."); sim_cflags="";;
no) sim_cflags="";;
*) sim_cflags=`echo "${enableval}" | sed -e "s/,/ /g"`;;
@@ -551,7 +551,7 @@ dnl arg[2] is a space separated list of extra target specific devices.
AC_DEFUN(SIM_AC_OPTION_HARDWARE,
[
sim_hardware="-DWITH_HW=1"
-sim_hw_obj="hw-device.o hw-ports.o hw-properties.o hw-base.o hw-tree.o"
+sim_hw_obj="hw-device.o hw-ports.o hw-properties.o hw-base.o hw-tree.o sim-hw.o"
hardware="ifelse([$1],,[core pal glue],[$1]) ifelse([$2],,,[$2])"
AC_ARG_ENABLE(sim-hardware,
[ --enable-sim-hardware=LIST Specify the hardware to be included in the build.],
@@ -572,12 +572,12 @@ for i in x $hardware ; do
*) sim_hw="$sim_hw $i" ;;
esac
done
-sim_hw_obj="$sim_hw_obj `echo $sim_hw | sed -e 's/\([[^ ]]*\)/dv-\1.o/g'`"
+sim_hw_obj="$sim_hw_obj `echo $sim_hw | sed -e 's/\([[^ ]][[^ ]]*\)/dv-\1.o/g'`"
if test x"$silent" != x"yes" && test x"$hardware" != x""; then
echo "Setting hardware to $sim_hardware, $sim_hw, $sim_hw_obj"
fi],[
sim_hw="$hardware"
-sim_hw_obj="$sim_hw_obj `echo $sim_hw | sed -e 's/\([[^ ]]*\)/dv-\1.o/g'`"
+sim_hw_obj="$sim_hw_obj `echo $sim_hw | sed -e 's/\([[^ ]][[^ ]]*\)/dv-\1.o/g'`"
if test x"$silent" != x"yes"; then
echo "Setting hardware to $sim_hardware, $sim_hw, $sim_hw_obj"
fi])dnl
@@ -589,6 +589,8 @@ AC_SUBST(sim_hw)
dnl --enable-sim-inline is for users that wish to ramp up the simulator's
dnl performance by inlining functions.
+dnl Guarantee that unconfigured simulators do not do any inlining
+sim_inline="-DDEFAULT_INLINE=0"
AC_DEFUN(SIM_AC_OPTION_INLINE,
[
default_sim_inline="ifelse([$1],,,-DDEFAULT_INLINE=[$1])"
@@ -598,15 +600,15 @@ AC_ARG_ENABLE(sim-inline,
case "$enableval" in
no) sim_inline="-DDEFAULT_INLINE=0";;
0) sim_inline="-DDEFAULT_INLINE=0";;
- yes | 2) sim_inline="-DDEFAULT_INLINE=ALL_INLINE";;
+ yes | 2) sim_inline="-DDEFAULT_INLINE=ALL_C_INLINE";;
1) sim_inline="-DDEFAULT_INLINE=INLINE_LOCALS";;
*) for x in `echo "$enableval" | sed -e "s/,/ /g"`; do
new_flag=""
case "$x" in
*_INLINE=*) new_flag="-D$x";;
*=*) new_flag=`echo "$x" | sed -e "s/=/_INLINE=/" -e "s/^/-D/"`;;
- *_INLINE) new_flag="-D$x=ALL_INLINE";;
- *) new_flag="-D$x""_INLINE=ALL_INLINE";;
+ *_INLINE) new_flag="-D$x=ALL_C_INLINE";;
+ *) new_flag="-D$x""_INLINE=ALL_C_INLINE";;
esac
if test x"$sim_inline" = x""; then
sim_inline="$new_flag"
diff --git a/sim/common/sim-bits.h b/sim/common/sim-bits.h
index 3170c61..1433c4c 100644
--- a/sim/common/sim-bits.h
+++ b/sim/common/sim-bits.h
@@ -24,7 +24,7 @@
#define _SIM_BITS_H_
-/* bit manipulation routines:
+/* Bit manipulation routines:
Bit numbering: The bits are numbered according to the target ISA's
convention. That being controlled by WITH_TARGET_WORD_MSB. For
@@ -42,15 +42,17 @@
NB: Use EXTRACTED, MSEXTRACTED and LSEXTRACTED as a guideline for
naming. LSMASK and LSMASKED are wrong.
- BIT*(POS): Constant with just 1 bit set.
+ BIT*(POS): `*' bit constant with just 1 bit set.
- LSBIT*(OFFSET): Constant with just 1 bit set - LS bit is zero.
+ LSBIT*(OFFSET): `*' bit constant with just 1 bit set - LS bit is
+ zero.
- MSBIT*(OFFSET): Constant with just 1 bit set - MS bit is zero.
+ MSBIT*(OFFSET): `*' bit constant with just 1 bit set - MS bit is
+ zero.
- MASK*(FIRST, LAST): Constant with bits [FIRST .. LAST] set. The
- <MACRO> (no size) version permits FIRST >= LAST and generates a
- wrapped bit mask vis ([0..LAST] | [FIRST..LSB]).
+ MASK*(FIRST, LAST): `*' bit constant with bits [FIRST .. LAST]
+ set. The <MACRO> (no size) version permits FIRST >= LAST and
+ generates a wrapped bit mask vis ([0..LAST] | [FIRST..LSB]).
LSMASK*(FIRST, LAST): Like MASK - LS bit is zero.
@@ -87,18 +89,26 @@
IEA_MASKED(SHOULD_MASK, ADDR): Convert the address to the targets
natural size. If in 32bit mode, discard the high 32bits.
- EXTENDED*(VALUE): Convert the `*' bit value to the targets natural
- word size. Sign extned the value if needed.
+ EXTEND*(VALUE): Convert the `*' bit value to the targets natural
+ word size. Sign extend the value if needed.
+
+ ALIGN_*(VALUE): Round the value upwards so that it is aligned to a
+ `_*' byte boundary.
- ALIGN_*(VALUE): Round upwards the value so that it is aligned.
+ FLOOR_*(VALUE): Truncate the value so that it is aligned to a `_*'
+ byte boundary.
- FLOOR_*(VALUE): Truncate the value so that it is aligned.
+ ROT*(VALUE, NR_BITS): Return the `*' bit VALUE rotated by NR_BITS
+ right (positive) or left (negative).
- ROTL*(VALUE, NR_BITS): Return the value rotated by NR_BITS left.
+ ROTL*(VALUE, NR_BITS): Return the `*' bit value rotated by NR_BITS
+ left. 0 <= NR_BITS <= `*'.
- ROTR*(VALUE, NR_BITS): Return the value rotated by NR_BITS right.
+ ROTR*(VALUE, NR_BITS): Return the `*' bit value rotated by NR_BITS
+ right. 0 <= NR_BITS <= N.
- SEXT*(VAL, SIGN_BIT): Treat SIGN_BIT as the sign, extend it.
+ SEXT*(VALUE, SIGN_BIT): Treat SIGN_BIT as VALUEs sign, extend it ti
+ `*' bits.
Note: Only the BIT* and MASK* macros return a constant that can be
used in variable declarations.
@@ -542,7 +552,7 @@ INLINE_SIM_BITS(unsigned_word) MSSEXT (signed_word val, int sign_bit);
-#if ((SIM_BITS_INLINE & INCLUDE_MODULE) && (SIM_BITS_INLINE & INCLUDED_BY_MODULE))
+#if H_REVEALS_MODULE_P (SIM_BITS_INLINE)
#include "sim-bits.c"
#endif
diff --git a/sim/common/sim-fpu.c b/sim/common/sim-fpu.c
index efc9244..99e922c 100644
--- a/sim/common/sim-fpu.c
+++ b/sim/common/sim-fpu.c
@@ -139,7 +139,7 @@ typedef union {
#define PADMASK (is_double ? 0 : LSMASK64 (NR_PAD32 - 1, 0))
#define NR_GUARDS32 (7 + NR_PAD32)
-#define NR_GUARDS64 (8 + NR_PAD32)
+#define NR_GUARDS64 (8 + NR_PAD64)
#define NR_GUARDS (is_double ? NR_GUARDS64 : NR_GUARDS32)
#define GUARDMASK LSMASK64 (NR_GUARDS - 1, 0)
@@ -2401,12 +2401,24 @@ sim_fpu_gt (int *is,
/* A number of useful constants */
-const sim_fpu sim_fpu_zero = { sim_fpu_class_zero, };
-const sim_fpu sim_fpu_qnan = { sim_fpu_class_qnan, };
-const sim_fpu sim_fpu_one = { sim_fpu_class_number, 0, IMPLICIT_1, 1 };
-const sim_fpu sim_fpu_two = { sim_fpu_class_number, 0, IMPLICIT_1, 2 };
-const sim_fpu sim_fpu_max32 = { sim_fpu_class_number, 0, LSMASK64 (NR_FRAC_GUARD, NR_GUARDS32), NORMAL_EXPMAX32 };
-const sim_fpu sim_fpu_max64 = { sim_fpu_class_number, 0, LSMASK64 (NR_FRAC_GUARD, NR_GUARDS64), NORMAL_EXPMAX64 };
+EXTERN_SIM_FPU (const sim_fpu) sim_fpu_zero = {
+ sim_fpu_class_zero,
+};
+EXTERN_SIM_FPU (const sim_fpu) sim_fpu_qnan = {
+ sim_fpu_class_qnan,
+};
+EXTERN_SIM_FPU (const sim_fpu) sim_fpu_one = {
+ sim_fpu_class_number, 0, IMPLICIT_1, 1
+};
+EXTERN_SIM_FPU (const sim_fpu) sim_fpu_two = {
+ sim_fpu_class_number, 0, IMPLICIT_1, 2
+};
+EXTERN_SIM_FPU (const sim_fpu) sim_fpu_max32 = {
+ sim_fpu_class_number, 0, LSMASK64 (NR_FRAC_GUARD, NR_GUARDS32), NORMAL_EXPMAX32
+};
+EXTERN_SIM_FPU (const sim_fpu) sim_fpu_max64 = {
+ sim_fpu_class_number, 0, LSMASK64 (NR_FRAC_GUARD, NR_GUARDS64), NORMAL_EXPMAX64
+};
/* For debugging */
diff --git a/sim/common/sim-fpu.h b/sim/common/sim-fpu.h
index 4871006..b48a04c 100644
--- a/sim/common/sim-fpu.h
+++ b/sim/common/sim-fpu.h
@@ -89,10 +89,9 @@ typedef enum
typedef struct _sim_fpu {
sim_fpu_class class;
- int normal_exp;
- int result;
int sign;
unsigned64 fraction;
+ int normal_exp;
} sim_fpu;
@@ -116,6 +115,7 @@ typedef enum
typedef enum
{
+ sim_fpu_denorm_default = 0,
sim_fpu_denorm_underflow_inexact = 1,
sim_fpu_denorm_zero = 2,
} sim_fpu_denorm;
@@ -177,16 +177,6 @@ INLINE_SIM_FPU (void) sim_fpu_to32 (unsigned32 *s, const sim_fpu *f);
INLINE_SIM_FPU (void) sim_fpu_to232 (unsigned32 *h, unsigned32 *l, const sim_fpu *f);
INLINE_SIM_FPU (void) sim_fpu_to64 (unsigned64 *d, const sim_fpu *f);
-#if WITH_TARGET_FLOATING_POINT_BITSIZE == 32
-#define sim_fpu_tofp sim_fpu_to32
-#define sim_fpu_fpto sim_fpu_32to
-#define sim_fpu_round_fp sim_fpu_round_32
-#endif
-#if WITH_TARGET_FLOATING_POINT_BITSIZE == 64
-#define sim_fpu_tofp sim_fpu_to64
-#define sim_fpu_fpto sim_fpu_64to
-#define sim_fpu_round_fp sim_fpu_round_64
-#endif
/* Rounding operators.
@@ -208,6 +198,12 @@ INLINE_SIM_FPU (int) sim_fpu_round_64 (sim_fpu *f,
FIXME: In the future, additional arguments ROUNDING and BITSIZE may
be added. */
+typedef int (sim_fpu_op1) (sim_fpu *f,
+ const sim_fpu *l);
+typedef int (sim_fpu_op2) (sim_fpu *f,
+ const sim_fpu *l,
+ const sim_fpu *r);
+
INLINE_SIM_FPU (int) sim_fpu_add (sim_fpu *f,
const sim_fpu *l, const sim_fpu *r);
INLINE_SIM_FPU (int) sim_fpu_sub (sim_fpu *f,
@@ -216,6 +212,10 @@ INLINE_SIM_FPU (int) sim_fpu_mul (sim_fpu *f,
const sim_fpu *l, const sim_fpu *r);
INLINE_SIM_FPU (int) sim_fpu_div (sim_fpu *f,
const sim_fpu *l, const sim_fpu *r);
+INLINE_SIM_FPU (int) sim_fpu_max (sim_fpu *f,
+ const sim_fpu *l, const sim_fpu *r);
+INLINE_SIM_FPU (int) sim_fpu_min (sim_fpu *f,
+ const sim_fpu *l, const sim_fpu *r);
INLINE_SIM_FPU (int) sim_fpu_neg (sim_fpu *f,
const sim_fpu *a);
INLINE_SIM_FPU (int) sim_fpu_abs (sim_fpu *f,
@@ -237,10 +237,14 @@ INLINE_SIM_FPU (int) sim_fpu_i64to (sim_fpu *f, signed64 i,
sim_fpu_round round);
INLINE_SIM_FPU (int) sim_fpu_u64to (sim_fpu *f, unsigned64 u,
sim_fpu_round round);
+#if 0
INLINE_SIM_FPU (int) sim_fpu_i232to (sim_fpu *f, signed32 h, signed32 l,
sim_fpu_round round);
+#endif
+#if 0
INLINE_SIM_FPU (int) sim_fpu_u232to (sim_fpu *f, unsigned32 h, unsigned32 l,
sim_fpu_round round);
+#endif
INLINE_SIM_FPU (int) sim_fpu_to32i (signed32 *i, const sim_fpu *f,
sim_fpu_round round);
@@ -250,11 +254,14 @@ INLINE_SIM_FPU (int) sim_fpu_to64i (signed64 *i, const sim_fpu *f,
sim_fpu_round round);
INLINE_SIM_FPU (int) sim_fpu_to64u (unsigned64 *u, const sim_fpu *f,
sim_fpu_round round);
+#if 0
INLINE_SIM_FPU (int) sim_fpu_to232i (signed64 *h, signed64 *l, const sim_fpu *f,
sim_fpu_round round);
+#endif
+#if 0
INLINE_SIM_FPU (int) sim_fpu_to232u (unsigned64 *h, unsigned64 *l, const sim_fpu *f,
sim_fpu_round round);
-
+#endif
/* Conversion of internal sim_fpu type to host double format.
@@ -271,11 +278,11 @@ INLINE_SIM_FPU (void) sim_fpu_d2 (sim_fpu *f, double d);
/* Specific number classes.
- NB: When either a 32/64 bit floating points is converted to
+ NB: When either, a 32/64 bit floating points is converted to
internal format, or an internal format number is rounded to 32/64
bit precision, a special marker is retained that indicates that the
value was normalized. For such numbers both is_number and
- is_denorm will return true. */
+ is_denorm return true. */
INLINE_SIM_FPU (int) sim_fpu_is_nan (const sim_fpu *s); /* 1 => SNaN or QNaN */
INLINE_SIM_FPU (int) sim_fpu_is_snan (const sim_fpu *s); /* 1 => SNaN */
@@ -287,10 +294,18 @@ INLINE_SIM_FPU (int) sim_fpu_is_number (const sim_fpu *s); /* !zero */
INLINE_SIM_FPU (int) sim_fpu_is_denorm (const sim_fpu *s); /* !zero */
+
+/* Floating point fields */
+
+INLINE_SIM_FPU (int) sim_fpu_sign (const sim_fpu *s);
+INLINE_SIM_FPU (int) sim_fpu_exp (const sim_fpu *s);
+
+
+
/* Specific comparison operators
- The comparison operators set *IS to zero and return a nonzero
- result for NaNs et.al. */
+ For NaNs et.al., the comparison operators will set IS to zero and
+ return a nonzero result. */
INLINE_SIM_FPU (int) sim_fpu_lt (int *is, const sim_fpu *l, const sim_fpu *r);
INLINE_SIM_FPU (int) sim_fpu_le (int *is, const sim_fpu *l, const sim_fpu *r);
@@ -341,10 +356,29 @@ INLINE_SIM_FPU (int) sim_fpu_cmp (const sim_fpu *l, const sim_fpu *r);
/* A constant of useful numbers */
-extern const sim_fpu sim_fpu_zero;
-extern const sim_fpu sim_fpu_one;
-extern const sim_fpu sim_fpu_two;
-extern const sim_fpu sim_fpu_qnan;
+EXTERN_SIM_FPU (const sim_fpu) sim_fpu_zero;
+EXTERN_SIM_FPU (const sim_fpu) sim_fpu_one;
+EXTERN_SIM_FPU (const sim_fpu) sim_fpu_two;
+EXTERN_SIM_FPU (const sim_fpu) sim_fpu_qnan;
+EXTERN_SIM_FPU (const sim_fpu) sim_fpu_max32;
+EXTERN_SIM_FPU (const sim_fpu) sim_fpu_max64;
+
+
+/* Select the applicable functions for the fp_word type */
+
+#if WITH_TARGET_FLOATING_POINT_BITSIZE == 32
+#define sim_fpu_tofp sim_fpu_to32
+#define sim_fpu_fpto sim_fpu_32to
+#define sim_fpu_round_fp sim_fpu_round_32
+#define sim_fpu_maxfp sim_fpu_max32
+#endif
+#if WITH_TARGET_FLOATING_POINT_BITSIZE == 64
+#define sim_fpu_tofp sim_fpu_to64
+#define sim_fpu_fpto sim_fpu_64to
+#define sim_fpu_round_fp sim_fpu_round_64
+#define sim_fpu_maxfp sim_fpu_max64
+#endif
+
/* For debugging */
@@ -359,4 +393,8 @@ INLINE_SIM_FPU (void) sim_fpu_print_status (int status,
sim_fpu_print_func *print,
void *arg);
+#if H_REVEALS_MODULE_P (SIM_FPU_INLINE)
+#include "sim-fpu.c"
+#endif
+
#endif