aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sim/ppc/ChangeLog11
-rw-r--r--sim/ppc/Makefile.in3
-rw-r--r--sim/ppc/bits.c20
-rw-r--r--sim/ppc/bits.h31
-rw-r--r--sim/ppc/main.c2
5 files changed, 63 insertions, 4 deletions
diff --git a/sim/ppc/ChangeLog b/sim/ppc/ChangeLog
index 8fdfc43..24db4a9 100644
--- a/sim/ppc/ChangeLog
+++ b/sim/ppc/ChangeLog
@@ -1,3 +1,14 @@
+2002-01-04 matthew green <mrg@redhat.com>
+
+ * bits.c (LSMASKED64): New inline function.
+ (LSEXTRACTED64): Likewise.
+ * bits.h (_LSB_POS, _LSMASKn, LSMASK64): New macros from
+ sim/common/sim-bits.h
+ (LSMASKED64, LSEXTRACTED64): New functions definitions.
+ * Makefile.in (sim-bits.o): Remove target.
+
+ * main.c (zalloc): Fix typo in error message.
+
2001-12-16 Andrew Cagney <ac131313@redhat.com>
* configure.in (sim_fpu): Don't add sim-bits.o.
diff --git a/sim/ppc/Makefile.in b/sim/ppc/Makefile.in
index 5aea414..0f78693 100644
--- a/sim/ppc/Makefile.in
+++ b/sim/ppc/Makefile.in
@@ -429,9 +429,6 @@ targ-map.o: targ-map.c targ-vals.h
sim-fpu.o: $(srcdir)/../common/sim-fpu.c config.h tconfig.h
$(CC) -c $(STD_CFLAGS) -DHAVE_CONFIG_H $(srcdir)/../common/sim-fpu.c
-sim-bits.o: $(srcdir)/../common/sim-bits.c config.h tconfig.h
- $(CC) -c $(STD_CFLAGS) -DHAVE_CONFIG_H $(srcdir)/../common/sim-bits.c
-
tconfig.h:
rm -f tconfig.h
echo > tconfig.h
diff --git a/sim/ppc/bits.c b/sim/ppc/bits.c
index 00bba51..4a3d9c6 100644
--- a/sim/ppc/bits.c
+++ b/sim/ppc/bits.c
@@ -24,8 +24,28 @@
#include "basics.h"
+INLINE_BITS\
+(unsigned64)
+LSMASKED64 (unsigned64 word,
+ int start,
+ int stop)
+{
+ word &= LSMASK64 (start, stop);
+ return word;
+}
INLINE_BITS\
+(unsigned64)
+LSEXTRACTED64 (unsigned64 val,
+ int start,
+ int stop)
+{
+ val <<= (64 - 1 - start); /* drop high bits */
+ val >>= (64 - 1 - start) + (stop); /* drop low bits */
+ return val;
+}
+
+INLINE_BITS\
(unsigned32)
MASKED32(unsigned32 word,
unsigned start,
diff --git a/sim/ppc/bits.h b/sim/ppc/bits.h
index 06898e0..35e4322 100644
--- a/sim/ppc/bits.h
+++ b/sim/ppc/bits.h
@@ -45,10 +45,15 @@
MASKED*(VALUE, FIRST, LAST): Masks out all but bits [FIRST
.. LAST].
+ LSMASKED*(VALUE, FIRST, LAST): Like MASKED - LS bit is zero.
+
EXTRACTED*(VALUE, FIRST, LAST): Masks out bits [FIRST .. LAST] but
also right shifts the masked value so that bit LAST becomes the
least significant (right most).
+ LSEXTRACTED*(VALUE, FIRST, LAST): Same as extracted - LS bit is
+ zero.
+
SHUFFLED**(VALUE, OLD, NEW): Mask then move a single bit from OLD
new NEW.
@@ -77,6 +82,13 @@
#define _MAKE_SHIFT(WIDTH, pos) ((WIDTH) - 1 - (pos))
+#if (WITH_TARGET_WORD_MSB == 0)
+#define _LSB_POS(WIDTH, SHIFT) (WIDTH - 1 - SHIFT)
+#else
+#define _LSB_POS(WIDTH, SHIFT) (SHIFT)
+#endif
+
+
/* MakeBit */
#define _BITn(WIDTH, pos) (((natural##WIDTH)(1)) \
<< _MAKE_SHIFT(WIDTH, pos))
@@ -104,6 +116,14 @@
#define MASK32(START, STOP) _MASKn(32, START, STOP)
#define MASK64(START, STOP) _MASKn(64, START, STOP)
+/* Multi-bit mask on least significant bits */
+
+#define _LSMASKn(WIDTH, FIRST, LAST) _MASKn (WIDTH, \
+ _LSB_POS (WIDTH, FIRST), \
+ _LSB_POS (WIDTH, LAST))
+
+#define LSMASK64(FIRST, LAST) _LSMASKn (64, (FIRST), (LAST))
+
#if (WITH_TARGET_WORD_BITSIZE == 64)
#define MASK(START, STOP) \
(((START) <= (STOP)) \
@@ -149,6 +169,12 @@ INLINE_BITS\
unsigned start,
unsigned stop);
+INLINE_BITS\
+(unsigned64) LSMASKED64
+(unsigned64 word,
+ int first,
+ int last);
+
/* extract the required bits aligning them with the lsb */
#define _EXTRACTEDn(WIDTH, WORD, START, STOP) \
@@ -165,6 +191,11 @@ INLINE_BITS\
unsigned start,
unsigned stop);
+INLINE_BITS\
+(unsigned64) LSEXTRACTED64
+(unsigned64 val,
+ int start,
+ int stop);
/* move a single bit around */
/* NB: the wierdness (N>O?N-O:0) is to stop a warning from GCC */
diff --git a/sim/ppc/main.c b/sim/ppc/main.c
index 3144454..f6ac87f 100644
--- a/sim/ppc/main.c
+++ b/sim/ppc/main.c
@@ -248,7 +248,7 @@ zalloc(long size)
{
void *memory = malloc(size);
if (memory == NULL)
- error("zmalloc failed\n");
+ error("zalloc failed\n");
memset(memory, 0, size);
return memory;
}