mirror of
https://github.com/darlinghq/darling-gdb.git
synced 2025-02-23 11:04:32 +00:00
Add {LS,MS}SEXT and {LS,MS}INSERTED macros. Eliminates bug in SEXT.
This commit is contained in:
parent
3f33acd039
commit
aa5e6a5a78
@ -1,3 +1,14 @@
|
||||
Tue Sep 16 16:15:16 1997 Andrew Cagney <cagney@b1.cygnus.com>
|
||||
|
||||
* sim-bits.c (LSSEXT, MSSEXT): Replace SEXT.
|
||||
(LSINSERTED, MSINSERTED): Ditto for INSERTED.
|
||||
|
||||
* sim-n-bits.h (MSSEXTn, LSSEXTn): Replace SEXTn.
|
||||
(LSINSERTDn, MSINSERTEDN): Ditto for INSERTEDn.
|
||||
|
||||
* sim-bits.h (SEXT*): Define as MSEXT/LSEXT.
|
||||
(INSERTED*): Ditto for LSINSERTED/MSINSERTED.
|
||||
|
||||
Mon Sep 15 17:36:15 1997 Andrew Cagney <cagney@b1.cygnus.com>
|
||||
|
||||
* aclocal.m4 (SIM_AC_COMMON): Add optional config.h file argument.
|
||||
|
@ -101,24 +101,47 @@ MSEXTRACTED (unsigned_word val,
|
||||
|
||||
INLINE_SIM_BITS\
|
||||
(unsigned_word)
|
||||
INSERTED (unsigned_word val,
|
||||
int start,
|
||||
int stop)
|
||||
LSINSERTED (unsigned_word val,
|
||||
int start,
|
||||
int stop)
|
||||
{
|
||||
ASSERT ((WITH_TARGET_WORD_MSB == 0 && start <= stop)
|
||||
|| (WITH_TARGET_WORD_MSB != 0 && start >= stop));
|
||||
ASSERT (start >= stop);
|
||||
#if (WITH_TARGET_WORD_BITSIZE == 64)
|
||||
return INSERTED64 (val, start, stop);
|
||||
return LSINSERTED64 (val, start, stop);
|
||||
#endif
|
||||
#if (WITH_TARGET_WORD_BITSIZE == 32)
|
||||
/* Bit numbers are 63..0, even for 32 bit targets.
|
||||
On 32 bit targets we ignore 63..32 */
|
||||
if (stop >= 32)
|
||||
return 0;
|
||||
else
|
||||
{
|
||||
val <<= stop;
|
||||
val &= LSMASK (start, stop);
|
||||
return val;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
INLINE_SIM_BITS\
|
||||
(unsigned_word)
|
||||
MSINSERTED (unsigned_word val,
|
||||
int start,
|
||||
int stop)
|
||||
{
|
||||
ASSERT (start <= stop);
|
||||
#if (WITH_TARGET_WORD_BITSIZE == 64)
|
||||
return MSINSERTED64 (val, start, stop);
|
||||
#endif
|
||||
#if (WITH_TARGET_WORD_BITSIZE == 32)
|
||||
/* Bit numbers are 0..63, even for 32 bit targets.
|
||||
On 32 bit targets we ignore 0..31. */
|
||||
if (_LSB_SHIFT (64, stop) >= 32)
|
||||
if (stop < 32)
|
||||
return 0;
|
||||
else
|
||||
{
|
||||
val &= LSMASK (_MAKE_WIDTH (start, stop), 0);
|
||||
val <<= _LSB_SHIFT (64, stop);
|
||||
val <<= ((64 - 1) - stop);
|
||||
val &= MSMASK (start, stop);
|
||||
return val;
|
||||
}
|
||||
#endif
|
||||
@ -128,21 +151,37 @@ INSERTED (unsigned_word val,
|
||||
|
||||
INLINE_SIM_BITS\
|
||||
(unsigned_word)
|
||||
SEXT (signed_word val,
|
||||
int sign_bit)
|
||||
LSSEXT (signed_word val,
|
||||
int sign_bit)
|
||||
{
|
||||
/* make the sign-bit most significant and then smear it back into
|
||||
position */
|
||||
ASSERT (sign_bit < 64);
|
||||
#if (WITH_TARGET_WORD_BITSIZE == 64)
|
||||
return SEXT64 (val, sign_bit);
|
||||
return LSSEXT64 (val, sign_bit);
|
||||
#endif
|
||||
#if (WITH_TARGET_WORD_BITSIZE == 32)
|
||||
if (_MSB_SHIFT (64, sign_bit) < 32)
|
||||
if (sign_bit >= 32)
|
||||
return val;
|
||||
else {
|
||||
val <<= (_MSB_SHIFT (64, sign_bit) - 32);
|
||||
val >>= (_MSB_SHIFT (64, sign_bit) - 32);
|
||||
val = LSSEXT32 (val, sign_bit);
|
||||
return val;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
INLINE_SIM_BITS\
|
||||
(unsigned_word)
|
||||
MSSEXT (signed_word val,
|
||||
int sign_bit)
|
||||
{
|
||||
ASSERT (sign_bit < 64);
|
||||
#if (WITH_TARGET_WORD_BITSIZE == 64)
|
||||
return MSSEXT64 (val, sign_bit);
|
||||
#endif
|
||||
#if (WITH_TARGET_WORD_BITSIZE == 32)
|
||||
if (sign_bit < 32)
|
||||
return val;
|
||||
else {
|
||||
val = MSSEXT32 (val, sign_bit - 32);
|
||||
return val;
|
||||
}
|
||||
#endif
|
||||
|
@ -391,11 +391,27 @@ INLINE_SIM_BITS(unsigned_word) MSEXTRACTED (unsigned_word val, int start, int st
|
||||
|
||||
/* move a group of bits around */
|
||||
|
||||
INLINE_SIM_BITS(unsigned16) INSERTED16 (unsigned16 val, int start, int stop);
|
||||
INLINE_SIM_BITS(unsigned32) INSERTED32 (unsigned32 val, int start, int stop);
|
||||
INLINE_SIM_BITS(unsigned64) INSERTED64 (unsigned64 val, int start, int stop);
|
||||
INLINE_SIM_BITS(unsigned16) LSINSERTED16 (unsigned16 val, int start, int stop);
|
||||
INLINE_SIM_BITS(unsigned32) LSINSERTED32 (unsigned32 val, int start, int stop);
|
||||
INLINE_SIM_BITS(unsigned64) LSINSERTED64 (unsigned64 val, int start, int stop);
|
||||
INLINE_SIM_BITS(unsigned_word) LSINSERTED (unsigned_word val, int start, int stop);
|
||||
|
||||
INLINE_SIM_BITS(unsigned_word) INSERTED (unsigned_word val, int start, int stop);
|
||||
INLINE_SIM_BITS(unsigned16) MSINSERTED16 (unsigned16 val, int start, int stop);
|
||||
INLINE_SIM_BITS(unsigned32) MSINSERTED32 (unsigned32 val, int start, int stop);
|
||||
INLINE_SIM_BITS(unsigned64) MSINSERTED64 (unsigned64 val, int start, int stop);
|
||||
INLINE_SIM_BITS(unsigned_word) MSINSERTED (unsigned_word val, int start, int stop);
|
||||
|
||||
#if (WITH_TARGET_WORD_MSB == 0)
|
||||
#define INSERTED16 MSINSERTED16
|
||||
#define INSERTED32 MSINSERTED32
|
||||
#define INSERTED64 MSINSERTED64
|
||||
#define INSERTED MSINSERTED
|
||||
#else
|
||||
#define INSERTED16 LSINSERTED16
|
||||
#define INSERTED32 LSINSERTED32
|
||||
#define INSERTED64 LSINSERTED64
|
||||
#define INSERTED LSINSERTED
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
@ -464,11 +480,27 @@ INLINE_SIM_BITS(unsigned64) ROTR64 (unsigned64 val, int shift);
|
||||
|
||||
/* Sign extension operations */
|
||||
|
||||
INLINE_SIM_BITS(unsigned16) SEXT16 (signed16 val, int sign_bit);
|
||||
INLINE_SIM_BITS(unsigned32) SEXT32 (signed32 val, int sign_bit);
|
||||
INLINE_SIM_BITS(unsigned64) SEXT64 (signed64 val, int sign_bit);
|
||||
INLINE_SIM_BITS(unsigned16) LSSEXT16 (signed16 val, int sign_bit);
|
||||
INLINE_SIM_BITS(unsigned32) LSSEXT32 (signed32 val, int sign_bit);
|
||||
INLINE_SIM_BITS(unsigned64) LSSEXT64 (signed64 val, int sign_bit);
|
||||
INLINE_SIM_BITS(unsigned_word) LSSEXT (signed_word val, int sign_bit);
|
||||
|
||||
INLINE_SIM_BITS(unsigned_word) SEXT (signed_word val, int sign_bit);
|
||||
INLINE_SIM_BITS(unsigned16) MSSEXT16 (signed16 val, int sign_bit);
|
||||
INLINE_SIM_BITS(unsigned32) MSSEXT32 (signed32 val, int sign_bit);
|
||||
INLINE_SIM_BITS(unsigned64) MSSEXT64 (signed64 val, int sign_bit);
|
||||
INLINE_SIM_BITS(unsigned_word) MSSEXT (signed_word val, int sign_bit);
|
||||
|
||||
#if (WITH_TARGET_WORD_MSB == 0)
|
||||
#define SEXT16 MSSEXT16
|
||||
#define SEXT32 MSSEXT32
|
||||
#define SEXT64 MSSEXT64
|
||||
#define SEXT MSSEXT
|
||||
#else
|
||||
#define SEXT16 LSSEXT16
|
||||
#define SEXT32 LSSEXT32
|
||||
#define SEXT64 LSSEXT64
|
||||
#define SEXT LSSEXT
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user