This is the mail archive of the
gdb-patches@sourceware.cygnus.com
mailing list for the GDB project.
[Patch 3/7]: 68HC11 port of gdb (sim-16bit support)
- To: gdb-patches at sourceware dot cygnus dot com
- Subject: [Patch 3/7]: 68HC11 port of gdb (sim-16bit support)
- From: Stephane Carrez <Stephane dot Carrez at free dot fr>
- Date: Mon, 26 Jun 2000 00:39:28 +0200
Hi!
The following patch adds support for 16-bit targets in the simulator
common framework.
Stephane
The ChangeLog for gdb/sim/common/ChangeLog is
2000-06-25 Stephane Carrez <Stephane.Carrez@worldnet.fr>
* sim-bits.h (_MSB_16, _LSB_16): Define for 16-bit targets.
(MASK, LSBIT, MSBIT): Likewise and use _MSB_16 and _LSB_16.
(EXTENDED): Define for 16-bit word size.
* sim-bits.c (LSEXTRACTED, MSEXTRACTED, LSINSERTED,
MSINSERTED, LSSEXT, MSSEXT): Implement for 16-bit word size.
* sim-types.h: Added support for 16-bit targets.
diff -Nrup --exclude-from=gdb-exclude.lst /src/gnu/cygnus/gdb/sim/common/sim-bits.c gdb/sim/common/sim-bits.c
--- /src/gnu/cygnus/gdb/sim/common/sim-bits.c Fri Apr 16 03:34:57 1999
+++ gdb/sim/common/sim-bits.c Sat Jun 17 11:59:43 2000
@@ -72,6 +72,17 @@ LSEXTRACTED (unsigned_word val,
return val;
}
#endif
+#if (WITH_TARGET_WORD_BITSIZE == 16)
+ if (stop >= 16)
+ return 0;
+ else
+ {
+ if (start < 16)
+ val &= LSMASK (start, 0);
+ val >>= stop;
+ return val;
+ }
+#endif
}
@@ -96,6 +107,17 @@ MSEXTRACTED (unsigned_word val,
return val;
}
#endif
+#if (WITH_TARGET_WORD_BITSIZE == 16)
+ if (stop < 16)
+ return 0;
+ else
+ {
+ if (start >= 16)
+ val &= MSMASK (start, 64 - 1);
+ val >>= (64 - stop - 1);
+ return val;
+ }
+#endif
}
@@ -121,6 +143,18 @@ LSINSERTED (unsigned_word val,
return val;
}
#endif
+#if (WITH_TARGET_WORD_BITSIZE == 16)
+ /* Bit numbers are 63..0, even for 16 bit targets.
+ On 16 bit targets we ignore 63..16 */
+ if (stop >= 16)
+ return 0;
+ else
+ {
+ val <<= stop;
+ val &= LSMASK (start, stop);
+ return val;
+ }
+#endif
}
INLINE_SIM_BITS\
@@ -145,6 +179,18 @@ MSINSERTED (unsigned_word val,
return val;
}
#endif
+#if (WITH_TARGET_WORD_BITSIZE == 16)
+ /* Bit numbers are 0..63, even for 16 bit targets.
+ On 16 bit targets we ignore 0..47. */
+ if (stop < 32 + 16)
+ return 0;
+ else
+ {
+ val <<= ((64 - 1) - stop);
+ val &= MSMASK (start, stop);
+ return val;
+ }
+#endif
}
@@ -166,6 +212,14 @@ LSSEXT (signed_word val,
return val;
}
#endif
+#if (WITH_TARGET_WORD_BITSIZE == 16)
+ if (sign_bit >= 16)
+ return val;
+ else {
+ val = LSSEXT16 (val, sign_bit);
+ return val;
+ }
+#endif
}
INLINE_SIM_BITS\
@@ -182,6 +236,14 @@ MSSEXT (signed_word val,
return val;
else {
val = MSSEXT32 (val, sign_bit - 32);
+ return val;
+ }
+#endif
+#if (WITH_TARGET_WORD_BITSIZE == 16)
+ if (sign_bit < 32 + 16)
+ return val;
+ else {
+ val = MSSEXT16 (val, sign_bit - 32 - 16);
return val;
}
#endif
diff -Nrup --exclude-from=gdb-exclude.lst /src/gnu/cygnus/gdb/sim/common/sim-bits.h gdb/sim/common/sim-bits.h
--- /src/gnu/cygnus/gdb/sim/common/sim-bits.h Fri Apr 16 03:34:57 1999
+++ gdb/sim/common/sim-bits.h Sat Jun 17 12:09:26 2000
@@ -166,20 +166,32 @@
#define _MSB_32(START, STOP) (START <= STOP \
? (START < 32 ? 0 : START - 32) \
: (STOP < 32 ? 0 : STOP - 32))
+#define _MSB_16(START, STOP) (START <= STOP \
+ ? (START < 48 ? 0 : START - 48) \
+ : (STOP < 48 ? 0 : STOP - 48))
#else
#define _MSB_32(START, STOP) (START >= STOP \
? (START >= 32 ? 31 : START) \
: (STOP >= 32 ? 31 : STOP))
+#define _MSB_16(START, STOP) (START >= STOP \
+ ? (START >= 16 ? 15 : START) \
+ : (STOP >= 16 ? 15 : STOP))
#endif
#if (WITH_TARGET_WORD_MSB == 0)
#define _LSB_32(START, STOP) (START <= STOP \
? (STOP < 32 ? 0 : STOP - 32) \
: (START < 32 ? 0 : START - 32))
+#define _LSB_16(START, STOP) (START <= STOP \
+ ? (STOP < 48 ? 0 : STOP - 48) \
+ : (START < 48 ? 0 : START - 48))
#else
#define _LSB_32(START, STOP) (START >= STOP \
? (STOP >= 32 ? 31 : STOP) \
: (START >= 32 ? 31 : START))
+#define _LSB_16(START, STOP) (START >= STOP \
+ ? (STOP >= 16 ? 15 : STOP) \
+ : (START >= 16 ? 15 : START))
#endif
#if (WITH_TARGET_WORD_MSB == 0)
@@ -204,11 +216,17 @@
#if (WITH_TARGET_WORD_BITSIZE == 64)
#define LSBIT(POS) LSBIT64 (POS)
-#else
+#endif
+#if (WITH_TARGET_WORD_BITSIZE == 32)
#define LSBIT(POS) ((unsigned32)((POS) >= 32 \
? 0 \
: (1 << ((POS) >= 32 ? 0 : (POS)))))
#endif
+#if (WITH_TARGET_WORD_BITSIZE == 16)
+#define LSBIT(POS) ((unsigned16)((POS) >= 16 \
+ ? 0 \
+ : (1 << ((POS) >= 16 ? 0 : (POS)))))
+#endif
#define MSBIT8(POS) ((unsigned8) 1 << ( 8 - 1 - (POS)))
@@ -218,11 +236,17 @@
#if (WITH_TARGET_WORD_BITSIZE == 64)
#define MSBIT(POS) MSBIT64 (POS)
-#else
+#endif
+#if (WITH_TARGET_WORD_BITSIZE == 32)
#define MSBIT(POS) ((unsigned32)((POS) < 32 \
? 0 \
: (1 << ((POS) < 32 ? 0 : (64 - 1) - (POS)))))
#endif
+#if (WITH_TARGET_WORD_BITSIZE == 16)
+#define MSBIT(POS) ((unsigned16)((POS) < 48 \
+ ? 0 \
+ : (1 << ((POS) < 48 ? 0 : (64 - 1) - (POS)))))
+#endif
/* Bit operations */
@@ -287,6 +311,23 @@
_MSB_POS (32, 0), \
_MSB_32 ((START), (STOP))))))
#endif
+#if (WITH_TARGET_WORD_BITSIZE == 16)
+#define MASK(START, STOP) \
+ (_POS_LE ((START), (STOP)) \
+ ? (_POS_LE ((STOP), _MSB_POS (64, 15)) \
+ ? 0 \
+ : _MASKn (16, \
+ _MSB_16 ((START), (STOP)), \
+ _LSB_16 ((START), (STOP)))) \
+ : (_MASKn (16, \
+ _LSB_16 ((START), (STOP)), \
+ _LSB_POS (16, 0)) \
+ | (_POS_LE ((STOP), _MSB_POS (64, 15)) \
+ ? 0 \
+ : _MASKn (16, \
+ _MSB_POS (16, 0), \
+ _MSB_16 ((START), (STOP))))))
+#endif
#if !defined (MASK)
#error "MASK never undefined"
#endif
@@ -473,6 +514,9 @@ INLINE_SIM_BITS(unsigned_word) MSINSERTE
#define EXTENDED(X) ((signed64)(signed32)(X))
#endif
#if (WITH_TARGET_WORD_BITSIZE == 32)
+#define EXTENDED(X) (X)
+#endif
+#if (WITH_TARGET_WORD_BITSIZE == 16)
#define EXTENDED(X) (X)
#endif
diff -Nrup --exclude-from=gdb-exclude.lst /src/gnu/cygnus/gdb/sim/common/sim-types.h gdb/sim/common/sim-types.h
--- /src/gnu/cygnus/gdb/sim/common/sim-types.h Fri Apr 16 03:34:59 1999
+++ gdb/sim/common/sim-types.h Mon Feb 21 09:00:23 2000
@@ -164,6 +164,10 @@ typedef signed64 signed_word;
typedef unsigned32 unsigned_word;
typedef signed32 signed_word;
#endif
+#if (WITH_TARGET_WORD_BITSIZE == 16)
+typedef unsigned16 unsigned_word;
+typedef signed16 signed_word;
+#endif
/* Other instructions */
@@ -174,6 +178,10 @@ typedef signed64 signed_address;
#if (WITH_TARGET_ADDRESS_BITSIZE == 32)
typedef unsigned32 unsigned_address;
typedef signed32 signed_address;
+#endif
+#if (WITH_TARGET_ADDRESS_BITSIZE == 16)
+typedef unsigned16 unsigned_address;
+typedef signed16 signed_address;
#endif
typedef unsigned_address address_word;