aboutsummaryrefslogtreecommitdiff
path: root/sim/h8300/compile.c
diff options
context:
space:
mode:
authorJeff Law <law@redhat.com>1996-07-03 05:10:47 +0000
committerJeff Law <law@redhat.com>1996-07-03 05:10:47 +0000
commit7647e0dd79067a650898281d3cffc4746aa09fae (patch)
tree1396570ea69bc0f6c1fa88dd6015590d978ad1db /sim/h8300/compile.c
parent7eaffbec23c3f842f31352e0d2ec2b6f35e1b1f9 (diff)
downloadgdb-7647e0dd79067a650898281d3cffc4746aa09fae.zip
gdb-7647e0dd79067a650898281d3cffc4746aa09fae.tar.gz
gdb-7647e0dd79067a650898281d3cffc4746aa09fae.tar.bz2
* run.c (main): Don't "load" sections which don't have
SEC_LOAD set. * compile.c (sim_resume, case "O_NOT"): Use ONOT instead of OSHIFTS. (ONOT): Define. (sim_resume, shift/rotate cases): Add support for shift/rotate by two bits. (OSHIFTS): Corresponding changes. Handling more H8/S ops.
Diffstat (limited to 'sim/h8300/compile.c')
-rw-r--r--sim/h8300/compile.c106
1 files changed, 73 insertions, 33 deletions
diff --git a/sim/h8300/compile.c b/sim/h8300/compile.c
index 21b9d65..a04657b 100644
--- a/sim/h8300/compile.c
+++ b/sim/h8300/compile.c
@@ -823,7 +823,7 @@ mop (code, bsize, sign)
}
-#define OSHIFTS(name, how) \
+#define ONOT(name, how) \
case O(name, SB): \
{ \
int t; \
@@ -849,6 +849,53 @@ case O(name, SL): \
goto shift32; \
}
+#define OSHIFTS(name, how1, how2) \
+case O(name, SB): \
+{ \
+ int t; \
+ int hm = 0x80; \
+ rd = GET_B_REG (code->src.reg); \
+ if ((GET_MEMORY_B (pc + 1) & 0x40) == 0) \
+ { \
+ how1; \
+ } \
+ else \
+ { \
+ how2; \
+ } \
+ goto shift8; \
+} \
+case O(name, SW): \
+{ \
+ int t; \
+ int hm = 0x8000; \
+ rd = GET_W_REG (code->src.reg); \
+ if ((GET_MEMORY_B (pc + 1) & 0x40) == 0) \
+ { \
+ how1; \
+ } \
+ else \
+ { \
+ how2; \
+ } \
+ goto shift16; \
+} \
+case O(name, SL): \
+{ \
+ int t; \
+ int hm = 0x80000000; \
+ rd = GET_L_REG (code->src.reg); \
+ if ((GET_MEMORY_B (pc + 1) & 0x40) == 0) \
+ { \
+ how1; \
+ } \
+ else \
+ { \
+ how2; \
+ } \
+ goto shift32; \
+}
+
#define OBITOP(name,f, s, op) \
case O(name, SB): \
{ \
@@ -1204,38 +1251,31 @@ sim_resume (step, siggnal)
printf ("%c", cpu.regs[2]);
goto next;
- OSHIFTS (O_NOT, rd = ~rd; v = 0;);
- OSHIFTS (O_SHLL, c = rd & hm; v = 0;
- rd <<= 1);
- OSHIFTS (O_SHLR, c = rd & 1; v = 0;
- rd = (unsigned int) rd >> 1);
- OSHIFTS (O_SHAL, c = rd & hm;
- v = (rd & hm) != ((rd & (hm >> 1)) << 1);
- rd <<= 1);
- OSHIFTS (O_SHAR, t = rd & hm;
- c = rd & 1;
- v = 0;
- rd >>= 1;
- rd |= t;
- );
- OSHIFTS (O_ROTL, c = rd & hm;
- v = 0;
- rd <<= 1;
- rd |= C);
- OSHIFTS (O_ROTR, c = rd & 1;
- v = 0;
- rd = (unsigned int) rd >> 1;
- if (c) rd |= hm;);
- OSHIFTS (O_ROTXL, t = rd & hm;
- rd <<= 1;
- rd |= C;
- c = t;
- v = 0;
- );
- OSHIFTS (O_ROTXR, t = rd & 1;
- rd = (unsigned int) rd >> 1;
- if (C) rd |= hm; c = t;
- v = 0;);
+ ONOT (O_NOT, rd = ~rd; v = 0;);
+ OSHIFTS (O_SHLL,
+ c = rd & hm; v = 0; rd <<= 1,
+ c = rd & (hm >> 1); v = 0; rd <<= 2);
+ OSHIFTS (O_SHLR,
+ c = rd & 1; v = 0; rd = (unsigned int) rd >> 1,
+ c = rd & 2; v = 0; rd = (unsigned int) rd >> 2);
+ OSHIFTS (O_SHAL,
+ c = rd & hm; v = (rd & hm) != ((rd & (hm >> 1)) << 1); rd <<= 1,
+ c = rd & (hm >> 1); v = (rd & (hm >> 1)) != ((rd & (hm >> 2)) << 2); rd <<= 2);
+ OSHIFTS (O_SHAR,
+ t = rd & hm; c = rd & 1; v = 0; rd >>= 1; rd |= t,
+ t = rd & hm; c = rd & 2; v = 0; rd >>= 2; rd |= t | t >> 1 );
+ OSHIFTS (O_ROTL,
+ c = rd & hm; v = 0; rd <<= 1; rd |= C,
+ c = rd & (hm >> 1); v = 0; rd <<= 2; rd |= C);
+ OSHIFTS (O_ROTR,
+ c = rd & 1; v = 0; rd = (unsigned int) rd >> 1; if (c) rd |= hm,
+ c = rd & 2; v = 0; rd = (unsigned int) rd >> 2; if (c) rd |= hm);
+ OSHIFTS (O_ROTXL,
+ t = rd & hm; rd <<= 1; rd |= C; c = t; v = 0,
+ t = rd & (hm >> 1); rd <<= 2; rd |= C; c = t; v = 0);
+ OSHIFTS (O_ROTXR,
+ t = rd & 1; rd = (unsigned int) rd >> 1; if (C) rd |= hm; c = t; v = 0,
+ t = rd & 2; rd = (unsigned int) rd >> 2; if (C) rd |= hm; c = t; v = 0);
case O (O_JMP, SB):
{