summaryrefslogtreecommitdiff
path: root/sim/h8300
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
parent7eaffbec23c3f842f31352e0d2ec2b6f35e1b1f9 (diff)
downloadbinutils-gdb-7647e0dd79067a650898281d3cffc4746aa09fae.tar.gz
* 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')
-rw-r--r--sim/h8300/ChangeLog11
-rw-r--r--sim/h8300/compile.c106
-rw-r--r--sim/h8300/run.c13
3 files changed, 94 insertions, 36 deletions
diff --git a/sim/h8300/ChangeLog b/sim/h8300/ChangeLog
index 0b76bf6509f..90a61c645d5 100644
--- a/sim/h8300/ChangeLog
+++ b/sim/h8300/ChangeLog
@@ -1,3 +1,14 @@
+Tue Jul 2 23:08:45 1996 Jeffrey A Law (law@cygnus.com)
+
+ * 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.
+
start-sanitize-h8s
Tue Jul 2 01:37:27 1996 Jeffrey A Law (law@cygnus.com)
diff --git a/sim/h8300/compile.c b/sim/h8300/compile.c
index 21b9d6587bb..a04657b5a53 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):
{
diff --git a/sim/h8300/run.c b/sim/h8300/run.c
index f19488a0f81..8921ae6c254 100644
--- a/sim/h8300/run.c
+++ b/sim/h8300/run.c
@@ -98,9 +98,16 @@ main (ac, av)
for (s = abfd->sections; s; s=s->next)
{
- char *buffer = malloc(bfd_section_size(abfd,s));
- bfd_get_section_contents(abfd, s, buffer, 0, bfd_section_size(abfd,s));
- sim_write(s->vma, buffer, bfd_section_size(abfd,s));
+ char *buffer;
+
+ if (s->flags & SEC_LOAD)
+ {
+
+ buffer = malloc(bfd_section_size(abfd,s));
+ bfd_get_section_contents(abfd, s, buffer, 0,
+ bfd_section_size (abfd, s));
+ sim_write(s->vma, buffer, bfd_section_size (abfd, s));
+ }
}
start_address = bfd_get_start_address(abfd);