diff options
-rw-r--r-- | sim/ppc/ChangeLog | 11 | ||||
-rw-r--r-- | sim/ppc/Makefile.in | 3 | ||||
-rw-r--r-- | sim/ppc/bits.c | 20 | ||||
-rw-r--r-- | sim/ppc/bits.h | 31 | ||||
-rw-r--r-- | sim/ppc/main.c | 2 |
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; } |