mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2025-02-17 13:10:12 +08:00
* mn10300_sim.h (struct _state): Put all registers into a single
array to make gdb implementation easier. (REG_*): Add definitions for all registers in the state array. (SEXT32, SEXT40, SEXT44, SEXT60): Remove unused macros. * simops.c: Related changes.
This commit is contained in:
parent
a2bfe134c1
commit
b774c0e4b1
@ -1,3 +1,11 @@
|
||||
Tue Dec 31 16:20:41 1996 Jeffrey A Law (law@cygnus.com)
|
||||
|
||||
* mn10300_sim.h (struct _state): Put all registers into a single
|
||||
array to make gdb implementation easier.
|
||||
(REG_*): Add definitions for all registers in the state array.
|
||||
(SEXT32, SEXT40, SEXT44, SEXT60): Remove unused macros.
|
||||
* simops.c: Related changes.
|
||||
|
||||
Wed Dec 18 10:10:45 1996 Jeffrey A Law (law@cygnus.com)
|
||||
|
||||
* interp.c (sim_resume): Handle 0xff as a single byte insn.
|
||||
|
@ -51,6 +51,7 @@ struct simops
|
||||
long mask;
|
||||
void (*func)();
|
||||
int length;
|
||||
int format;
|
||||
int numops;
|
||||
int operands[16];
|
||||
};
|
||||
@ -59,9 +60,8 @@ struct simops
|
||||
|
||||
struct _state
|
||||
{
|
||||
reg_t regs[12]; /* registers, d0-d3, a0-a3, sp, mdr, lar, lir */
|
||||
reg_t sregs[8]; /* system registers, including psw */
|
||||
reg_t pc;
|
||||
reg_t regs[12]; /* registers, d0-d3, a0-a3, sp, pc, mdr, psw,
|
||||
lir, lar */
|
||||
uint8 *mem; /* main memory */
|
||||
int exception;
|
||||
} State;
|
||||
@ -69,9 +69,9 @@ struct _state
|
||||
extern uint32 OP[4];
|
||||
extern struct simops Simops[];
|
||||
|
||||
#define PC (State.pc)
|
||||
#define PC (State.regs[9])
|
||||
|
||||
#define PSW (State.sregs[0])
|
||||
#define PSW (State.regs[11])
|
||||
#define PSW_V 0x1
|
||||
#define PSW_C 0x2
|
||||
#define PSW_N 0x4
|
||||
@ -80,9 +80,11 @@ extern struct simops Simops[];
|
||||
#define REG_D0 0
|
||||
#define REG_A0 4
|
||||
#define REG_SP 8
|
||||
#define REG_MDR 9
|
||||
#define REG_LAR 10
|
||||
#define REG_LIR 11
|
||||
#define REG_PC 9
|
||||
#define REG_MDR 10
|
||||
#define REG_PSW 11
|
||||
#define REG_LIR 12
|
||||
#define REG_LAR 13
|
||||
|
||||
#define SEXT3(x) ((((x)&0x7)^(~0x3))+0x4)
|
||||
|
||||
@ -104,18 +106,6 @@ extern struct simops Simops[];
|
||||
/* sign-extend a 22-bit number */
|
||||
#define SEXT22(x) ((((x)&0x3fffff)^(~0x1fffff))+0x200000)
|
||||
|
||||
/* sign-extend a 32-bit number */
|
||||
#define SEXT32(x) ((((x)&0xffffffffLL)^(~0x7fffffffLL))+0x80000000LL)
|
||||
|
||||
/* sign extend a 40 bit number */
|
||||
#define SEXT40(x) ((((x)&0xffffffffffLL)^(~0x7fffffffffLL))+0x8000000000LL)
|
||||
|
||||
/* sign extend a 44 bit number */
|
||||
#define SEXT44(x) ((((x)&0xfffffffffffLL)^(~0x7ffffffffffLL))+0x80000000000LL)
|
||||
|
||||
/* sign extend a 60 bit number */
|
||||
#define SEXT60(x) ((((x)&0xfffffffffffffffLL)^(~0x7ffffffffffffffLL))+0x800000000000000LL)
|
||||
|
||||
#define MAX32 0x7fffffffLL
|
||||
#define MIN32 0xff80000000LL
|
||||
#define MASK32 0xffffffffLL
|
||||
|
@ -2253,7 +2253,7 @@ void OP_C800 (insn, extension)
|
||||
/* The dispatching code will add 2 after we return, so
|
||||
we subtract two here to make things right. */
|
||||
if (PSW & PSW_Z)
|
||||
State.pc += SEXT8 (insn & 0xff) - 2;
|
||||
State.regs[REG_PC] += SEXT8 (insn & 0xff) - 2;
|
||||
}
|
||||
|
||||
/* bne label:8 */
|
||||
@ -2263,7 +2263,7 @@ void OP_C900 (insn, extension)
|
||||
/* The dispatching code will add 2 after we return, so
|
||||
we subtract two here to make things right. */
|
||||
if (!(PSW & PSW_Z))
|
||||
State.pc += SEXT8 (insn & 0xff) - 2;
|
||||
State.regs[REG_PC] += SEXT8 (insn & 0xff) - 2;
|
||||
}
|
||||
|
||||
/* bgt label:8 */
|
||||
@ -2274,7 +2274,7 @@ void OP_C100 (insn, extension)
|
||||
we subtract two here to make things right. */
|
||||
if (!((PSW & PSW_Z)
|
||||
|| (((PSW & PSW_N) != 0) ^ ((PSW & PSW_V) != 0))))
|
||||
State.pc += SEXT8 (insn & 0xff) - 2;
|
||||
State.regs[REG_PC] += SEXT8 (insn & 0xff) - 2;
|
||||
}
|
||||
|
||||
/* bge label:8 */
|
||||
@ -2284,7 +2284,7 @@ void OP_C200 (insn, extension)
|
||||
/* The dispatching code will add 2 after we return, so
|
||||
we subtract two here to make things right. */
|
||||
if (!(((PSW & PSW_N) != 0) ^ ((PSW & PSW_V) != 0)))
|
||||
State.pc += SEXT8 (insn & 0xff) - 2;
|
||||
State.regs[REG_PC] += SEXT8 (insn & 0xff) - 2;
|
||||
}
|
||||
|
||||
/* ble label:8 */
|
||||
@ -2295,7 +2295,7 @@ void OP_C300 (insn, extension)
|
||||
we subtract two here to make things right. */
|
||||
if ((PSW & PSW_Z)
|
||||
|| (((PSW & PSW_N) != 0) ^ ((PSW & PSW_V) != 0)))
|
||||
State.pc += SEXT8 (insn & 0xff) - 2;
|
||||
State.regs[REG_PC] += SEXT8 (insn & 0xff) - 2;
|
||||
}
|
||||
|
||||
/* blt label:8 */
|
||||
@ -2305,7 +2305,7 @@ void OP_C000 (insn, extension)
|
||||
/* The dispatching code will add 2 after we return, so
|
||||
we subtract two here to make things right. */
|
||||
if (((PSW & PSW_N) != 0) ^ ((PSW & PSW_V) != 0))
|
||||
State.pc += SEXT8 (insn & 0xff) - 2;
|
||||
State.regs[REG_PC] += SEXT8 (insn & 0xff) - 2;
|
||||
}
|
||||
|
||||
/* bhi label:8 */
|
||||
@ -2315,7 +2315,7 @@ void OP_C500 (insn, extension)
|
||||
/* The dispatching code will add 2 after we return, so
|
||||
we subtract two here to make things right. */
|
||||
if (!(((PSW & PSW_C) != 0) || (PSW & PSW_Z) != 0))
|
||||
State.pc += SEXT8 (insn & 0xff) - 2;
|
||||
State.regs[REG_PC] += SEXT8 (insn & 0xff) - 2;
|
||||
}
|
||||
|
||||
/* bcc label:8 */
|
||||
@ -2325,7 +2325,7 @@ void OP_C600 (insn, extension)
|
||||
/* The dispatching code will add 2 after we return, so
|
||||
we subtract two here to make things right. */
|
||||
if (!(PSW & PSW_C))
|
||||
State.pc += SEXT8 (insn & 0xff) - 2;
|
||||
State.regs[REG_PC] += SEXT8 (insn & 0xff) - 2;
|
||||
}
|
||||
|
||||
/* bls label:8 */
|
||||
@ -2335,7 +2335,7 @@ void OP_C700 (insn, extension)
|
||||
/* The dispatching code will add 2 after we return, so
|
||||
we subtract two here to make things right. */
|
||||
if (((PSW & PSW_C) != 0) || (PSW & PSW_Z) != 0)
|
||||
State.pc += SEXT8 (insn & 0xff) - 2;
|
||||
State.regs[REG_PC] += SEXT8 (insn & 0xff) - 2;
|
||||
}
|
||||
|
||||
/* bcs label:8 */
|
||||
@ -2345,7 +2345,7 @@ void OP_C400 (insn, extension)
|
||||
/* The dispatching code will add 2 after we return, so
|
||||
we subtract two here to make things right. */
|
||||
if (PSW & PSW_C)
|
||||
State.pc += SEXT8 (insn & 0xff) - 2;
|
||||
State.regs[REG_PC] += SEXT8 (insn & 0xff) - 2;
|
||||
}
|
||||
|
||||
/* bvc label:8 */
|
||||
@ -2355,7 +2355,7 @@ void OP_F8E800 (insn, extension)
|
||||
/* The dispatching code will add 3 after we return, so
|
||||
we subtract two here to make things right. */
|
||||
if (!(PSW & PSW_V))
|
||||
State.pc += SEXT8 (insn & 0xff) - 3;
|
||||
State.regs[REG_PC] += SEXT8 (insn & 0xff) - 3;
|
||||
}
|
||||
|
||||
/* bvs label:8 */
|
||||
@ -2365,7 +2365,7 @@ void OP_F8E900 (insn, extension)
|
||||
/* The dispatching code will add 3 after we return, so
|
||||
we subtract two here to make things right. */
|
||||
if (PSW & PSW_V)
|
||||
State.pc += SEXT8 (insn & 0xff) - 3;
|
||||
State.regs[REG_PC] += SEXT8 (insn & 0xff) - 3;
|
||||
}
|
||||
|
||||
/* bnc label:8 */
|
||||
@ -2375,7 +2375,7 @@ void OP_F8EA00 (insn, extension)
|
||||
/* The dispatching code will add 3 after we return, so
|
||||
we subtract two here to make things right. */
|
||||
if (!(PSW & PSW_N))
|
||||
State.pc += SEXT8 (insn & 0xff) - 3;
|
||||
State.regs[REG_PC] += SEXT8 (insn & 0xff) - 3;
|
||||
}
|
||||
|
||||
/* bns label:8 */
|
||||
@ -2385,7 +2385,7 @@ void OP_F8EB00 (insn, extension)
|
||||
/* The dispatching code will add 3 after we return, so
|
||||
we subtract two here to make things right. */
|
||||
if (PSW & PSW_N)
|
||||
State.pc += SEXT8 (insn & 0xff) - 3;
|
||||
State.regs[REG_PC] += SEXT8 (insn & 0xff) - 3;
|
||||
}
|
||||
|
||||
/* bra label:8 */
|
||||
@ -2394,7 +2394,7 @@ void OP_CA00 (insn, extension)
|
||||
{
|
||||
/* The dispatching code will add 2 after we return, so
|
||||
we subtract two here to make things right. */
|
||||
State.pc += SEXT8 (insn & 0xff) - 2;
|
||||
State.regs[REG_PC] += SEXT8 (insn & 0xff) - 2;
|
||||
}
|
||||
|
||||
/* leq */
|
||||
@ -2485,21 +2485,21 @@ void OP_DB (insn, extension)
|
||||
void OP_F0F4 (insn, extension)
|
||||
unsigned long insn, extension;
|
||||
{
|
||||
State.pc = State.regs[REG_A0 + REG0 (insn)] - 2;
|
||||
State.regs[REG_PC] = State.regs[REG_A0 + REG0 (insn)] - 2;
|
||||
}
|
||||
|
||||
/* jmp label:16 */
|
||||
void OP_CC0000 (insn, extension)
|
||||
unsigned long insn, extension;
|
||||
{
|
||||
State.pc += SEXT16 (insn & 0xffff) - 3;
|
||||
State.regs[REG_PC] += SEXT16 (insn & 0xffff) - 3;
|
||||
}
|
||||
|
||||
/* jmp label:32 */
|
||||
void OP_DC000000 (insn, extension)
|
||||
unsigned long insn, extension;
|
||||
{
|
||||
State.pc += (((insn & 0xffffff) << 8) + extension) - 5;
|
||||
State.regs[REG_PC] += (((insn & 0xffffff) << 8) + extension) - 5;
|
||||
}
|
||||
|
||||
/* call label:16,reg_list,imm8 */
|
||||
@ -2510,7 +2510,7 @@ void OP_CD000000 (insn, extension)
|
||||
unsigned long mask;
|
||||
|
||||
sp = State.regs[REG_SP];
|
||||
next_pc = State.pc + 2;
|
||||
next_pc = State.regs[REG_PC] + 2;
|
||||
State.mem[sp] = next_pc & 0xff;
|
||||
State.mem[sp+1] = (next_pc & 0xff00) >> 8;
|
||||
State.mem[sp+2] = (next_pc & 0xff0000) >> 16;
|
||||
@ -2565,7 +2565,7 @@ void OP_CD000000 (insn, extension)
|
||||
/* And make sure to update the stack pointer. */
|
||||
State.regs[REG_SP] -= extension;
|
||||
State.regs[REG_MDR] = next_pc;
|
||||
State.pc += SEXT16 ((insn & 0xffff00) >> 8) - 5;
|
||||
State.regs[REG_PC] += SEXT16 ((insn & 0xffff00) >> 8) - 5;
|
||||
}
|
||||
|
||||
/* call label:32,reg_list,imm8*/
|
||||
@ -2576,7 +2576,7 @@ void OP_DD000000 (insn, extension)
|
||||
unsigned long mask;
|
||||
|
||||
sp = State.regs[REG_SP];
|
||||
next_pc = State.pc + 2;
|
||||
next_pc = State.regs[REG_PC] + 2;
|
||||
State.mem[sp] = next_pc & 0xff;
|
||||
State.mem[sp+1] = (next_pc & 0xff00) >> 8;
|
||||
State.mem[sp+2] = (next_pc & 0xff0000) >> 16;
|
||||
@ -2631,7 +2631,7 @@ void OP_DD000000 (insn, extension)
|
||||
/* And make sure to update the stack pointer. */
|
||||
State.regs[REG_SP] -= (extension & 0xff);
|
||||
State.regs[REG_MDR] = next_pc;
|
||||
State.pc += (((insn & 0xffffff) << 8) | ((extension & 0xff0000) >> 16)) - 7;
|
||||
State.regs[REG_PC] += (((insn & 0xffffff) << 8) | ((extension & 0xff0000) >> 16)) - 7;
|
||||
}
|
||||
|
||||
/* calls (an) */
|
||||
@ -2641,13 +2641,13 @@ void OP_F0F0 (insn, extension)
|
||||
unsigned int next_pc, sp;
|
||||
|
||||
sp = State.regs[REG_SP];
|
||||
next_pc = State.pc + 2;
|
||||
next_pc = State.regs[REG_PC] + 2;
|
||||
State.mem[sp] = next_pc & 0xff;
|
||||
State.mem[sp+1] = (next_pc & 0xff00) >> 8;
|
||||
State.mem[sp+2] = (next_pc & 0xff0000) >> 16;
|
||||
State.mem[sp+3] = (next_pc & 0xff000000) >> 24;
|
||||
State.regs[REG_MDR] = next_pc;
|
||||
State.pc = State.regs[REG_A0 + REG0 (insn)] - 2;
|
||||
State.regs[REG_PC] = State.regs[REG_A0 + REG0 (insn)] - 2;
|
||||
}
|
||||
|
||||
/* calls label:16 */
|
||||
@ -2657,13 +2657,13 @@ void OP_FAFF0000 (insn, extension)
|
||||
unsigned int next_pc, sp;
|
||||
|
||||
sp = State.regs[REG_SP];
|
||||
next_pc = State.pc + 4;
|
||||
next_pc = State.regs[REG_PC] + 4;
|
||||
State.mem[sp] = next_pc & 0xff;
|
||||
State.mem[sp+1] = (next_pc & 0xff00) >> 8;
|
||||
State.mem[sp+2] = (next_pc & 0xff0000) >> 16;
|
||||
State.mem[sp+3] = (next_pc & 0xff000000) >> 24;
|
||||
State.regs[REG_MDR] = next_pc;
|
||||
State.pc += SEXT16 (insn & 0xffff) - 4;
|
||||
State.regs[REG_PC] += SEXT16 (insn & 0xffff) - 4;
|
||||
}
|
||||
|
||||
/* calls label:32 */
|
||||
@ -2673,13 +2673,13 @@ void OP_FCFF0000 (insn, extension)
|
||||
unsigned int next_pc, sp;
|
||||
|
||||
sp = State.regs[REG_SP];
|
||||
next_pc = State.pc + 6;
|
||||
next_pc = State.regs[REG_PC] + 6;
|
||||
State.mem[sp] = next_pc & 0xff;
|
||||
State.mem[sp+1] = (next_pc & 0xff00) >> 8;
|
||||
State.mem[sp+2] = (next_pc & 0xff0000) >> 16;
|
||||
State.mem[sp+3] = (next_pc & 0xff000000) >> 24;
|
||||
State.regs[REG_MDR] = next_pc;
|
||||
State.pc += (((insn & 0xffff) << 16) + extension) - 6;
|
||||
State.regs[REG_PC] += (((insn & 0xffff) << 16) + extension) - 6;
|
||||
}
|
||||
|
||||
/* ret reg_list, imm8 */
|
||||
@ -2741,9 +2741,9 @@ void OP_DF0000 (insn, extension)
|
||||
State.regs[REG_SP] = sp;
|
||||
|
||||
/* Restore the PC value. */
|
||||
State.pc = (State.mem[sp] | (State.mem[sp+1] << 8)
|
||||
State.regs[REG_PC] = (State.mem[sp] | (State.mem[sp+1] << 8)
|
||||
| (State.mem[sp+2] << 16) | (State.mem[sp+3] << 24));
|
||||
State.pc -= 3;
|
||||
State.regs[REG_PC] -= 3;
|
||||
}
|
||||
|
||||
/* retf reg_list,imm8 */
|
||||
@ -2755,7 +2755,7 @@ void OP_DE0000 (insn, extension)
|
||||
|
||||
sp = State.regs[REG_SP] + (insn & 0xff);
|
||||
State.regs[REG_SP] = sp;
|
||||
State.pc = State.regs[REG_MDR] - 3;
|
||||
State.regs[REG_PC] = State.regs[REG_MDR] - 3;
|
||||
|
||||
sp = State.regs[REG_SP];
|
||||
|
||||
@ -2815,9 +2815,9 @@ void OP_F0FC (insn, extension)
|
||||
unsigned int sp;
|
||||
|
||||
sp = State.regs[REG_SP];
|
||||
State.pc = (State.mem[sp] | (State.mem[sp+1] << 8)
|
||||
State.regs[REG_PC] = (State.mem[sp] | (State.mem[sp+1] << 8)
|
||||
| (State.mem[sp+2] << 16) | (State.mem[sp+3] << 24));
|
||||
State.pc -= 2;
|
||||
State.regs[REG_PC] -= 2;
|
||||
}
|
||||
|
||||
/* rti */
|
||||
|
Loading…
Reference in New Issue
Block a user