diff options
author | Jeff Law <law@redhat.com> | 1996-07-03 05:10:47 +0000 |
---|---|---|
committer | Jeff Law <law@redhat.com> | 1996-07-03 05:10:47 +0000 |
commit | 7647e0dd79067a650898281d3cffc4746aa09fae (patch) | |
tree | 1396570ea69bc0f6c1fa88dd6015590d978ad1db /sim/h8300/compile.c | |
parent | 7eaffbec23c3f842f31352e0d2ec2b6f35e1b1f9 (diff) | |
download | gdb-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.c | 106 |
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): { |