diff options
author | Jeff Law <law@redhat.com> | 1997-06-10 22:59:13 +0000 |
---|---|---|
committer | Jeff Law <law@redhat.com> | 1997-06-10 22:59:13 +0000 |
commit | dbdb5bd881be2d52e24ec53dd414a35eab43e7dd (patch) | |
tree | 2436e2a56496ed3655eb3bb593bf64d5b5aba0c4 | |
parent | 601acd615834d15fbb7994a79aca84beb7b84d6d (diff) | |
download | gdb-dbdb5bd881be2d52e24ec53dd414a35eab43e7dd.zip gdb-dbdb5bd881be2d52e24ec53dd414a35eab43e7dd.tar.gz gdb-dbdb5bd881be2d52e24ec53dd414a35eab43e7dd.tar.bz2 |
* simops.c: "call" stores the callee saved registers into the
stack! Update the stack pointer properly when done with
register saves.
-rw-r--r-- | sim/mn10300/ChangeLog | 4 | ||||
-rw-r--r-- | sim/mn10300/simops.c | 104 |
2 files changed, 55 insertions, 53 deletions
diff --git a/sim/mn10300/ChangeLog b/sim/mn10300/ChangeLog index 6a68606..065fd93 100644 --- a/sim/mn10300/ChangeLog +++ b/sim/mn10300/ChangeLog @@ -1,5 +1,9 @@ Tue Jun 10 12:31:32 1997 Jeffrey A Law (law@cygnus.com) + * simops.c: "call" stores the callee saved registers into the + stack! Update the stack pointer properly when done with + register saves. + * simops.c: Fix return address computation for "call" instructions. Thu May 22 01:43:11 1997 Jeffrey A Law (law@cygnus.com) diff --git a/sim/mn10300/simops.c b/sim/mn10300/simops.c index a913f4c..d92cc43 100644 --- a/sim/mn10300/simops.c +++ b/sim/mn10300/simops.c @@ -2531,7 +2531,7 @@ void OP_DC000000 (insn, extension) void OP_CD000000 (insn, extension) unsigned long insn, extension; { - unsigned int next_pc, sp, adjust; + unsigned int next_pc, sp; unsigned long mask; sp = State.regs[REG_SP]; @@ -2543,52 +2543,51 @@ void OP_CD000000 (insn, extension) mask = insn & 0xff; - adjust = 0; if (mask & 0x80) { - adjust -= 4; - State.regs[REG_D0 + 2] = load_word (sp + adjust); + sp -= 4; + store_word (sp, State.regs[REG_D0 + 2]); } if (mask & 0x40) { - adjust -= 4; - State.regs[REG_D0 + 3] = load_word (sp + adjust); + sp -= 4; + store_word (sp, State.regs[REG_D0 + 3]); } if (mask & 0x20) { - adjust -= 4; - State.regs[REG_A0 + 2] = load_word (sp + adjust); + sp -= 4; + store_word (sp, State.regs[REG_A0 + 2]); } if (mask & 0x10) { - adjust -= 4; - State.regs[REG_A0 + 3] = load_word (sp + adjust); + sp -= 4; + store_word (sp, State.regs[REG_A0 + 3]); } if (mask & 0x8) { - adjust -= 4; - State.regs[REG_D0] = load_word (sp + adjust); - adjust -= 4; - State.regs[REG_D0 + 1] = load_word (sp + adjust); - adjust -= 4; - State.regs[REG_A0] = load_word (sp + adjust); - adjust -= 4; - State.regs[REG_A0 + 1] = load_word (sp + adjust); - adjust -= 4; - State.regs[REG_MDR] = load_word (sp + adjust); - adjust -= 4; - State.regs[REG_LIR] = load_word (sp + adjust); - adjust -= 4; - State.regs[REG_LAR] = load_word (sp + adjust); - adjust -= 4; + sp -= 4; + store_word (sp, State.regs[REG_D0]); + sp -= 4; + store_word (sp, State.regs[REG_D0 + 1]); + sp -= 4; + store_word (sp, State.regs[REG_A0]); + sp -= 4; + store_word (sp, State.regs[REG_A0 + 1]); + sp -= 4; + store_word (sp, State.regs[REG_MDR]); + sp -= 4; + store_word (sp, State.regs[REG_LIR]); + sp -= 4; + store_word (sp, State.regs[REG_LAR]); + sp -= 4; } - /* And make sure to update the stack pointer. */ - State.regs[REG_SP] -= extension; + /* Update the stack pointer. */ + State.regs[REG_SP] = sp - extension; State.regs[REG_MDR] = next_pc; State.regs[REG_PC] += SEXT16 ((insn & 0xffff00) >> 8) - 5; } @@ -2609,52 +2608,51 @@ void OP_DD000000 (insn, extension) mask = (extension & 0xff00) >> 8; - adjust = 0; if (mask & 0x80) { - adjust -= 4; - State.regs[REG_D0 + 2] = load_word (sp + adjust); + sp -= 4; + store_word (sp, State.regs[REG_D0 + 2]); } if (mask & 0x40) { - adjust -= 4; - State.regs[REG_D0 + 3] = load_word (sp + adjust); + sp -= 4; + store_word (sp, State.regs[REG_D0 + 3]); } if (mask & 0x20) { - adjust -= 4; - State.regs[REG_A0 + 2] = load_word (sp + adjust); + sp -= 4; + store_word (sp, State.regs[REG_A0 + 2]); } if (mask & 0x10) { - adjust -= 4; - State.regs[REG_A0 + 3] = load_word (sp + adjust); + sp -= 4; + store_word (sp, State.regs[REG_A0 + 3]); } if (mask & 0x8) { - adjust -= 4; - State.regs[REG_D0] = load_word (sp + adjust); - adjust -= 4; - State.regs[REG_D0 + 1] = load_word (sp + adjust); - adjust -= 4; - State.regs[REG_A0] = load_word (sp + adjust); - adjust -= 4; - State.regs[REG_A0 + 1] = load_word (sp + adjust); - adjust -= 4; - State.regs[REG_MDR] = load_word (sp + adjust); - adjust -= 4; - State.regs[REG_LIR] = load_word (sp + adjust); - adjust -= 4; - State.regs[REG_LAR] = load_word (sp + adjust); - adjust -= 4; + sp -= 4; + store_word (sp, State.regs[REG_D0]); + sp -= 4; + store_word (sp, State.regs[REG_D0 + 1]); + sp -= 4; + store_word (sp, State.regs[REG_A0]); + sp -= 4; + store_word (sp, State.regs[REG_A0 + 1]); + sp -= 4; + store_word (sp, State.regs[REG_MDR]); + sp -= 4; + store_word (sp, State.regs[REG_LIR]); + sp -= 4; + store_word (sp, State.regs[REG_LAR]); + sp -= 4; } - /* And make sure to update the stack pointer. */ - State.regs[REG_SP] -= (extension & 0xff); + /* Update the stack pointer. */ + State.regs[REG_SP] = sp - extension; State.regs[REG_MDR] = next_pc; State.regs[REG_PC] += (((insn & 0xffffff) << 8) | ((extension & 0xff0000) >> 16)) - 7; } |